# Functional JavaScript Cheat Sheet

## Pure Functions​

Pure functions are functions that always produce the same output for the same input and have no side effects. They rely only on their input parameters and return a value without modifying any external state.

function add(a, b) {  return a + b;}

In the example above, the add function is pure because it consistently returns the sum of its two parameters a and b. It doesn't modify any variables outside its scope or have any other side effects.

## Higher-Order Functions​

Higher-order functions are functions that can accept other functions as arguments or return functions as their results. They enable powerful functional programming techniques in JavaScript.

function map(array, transform) {  const result = [];  for (let i = 0; i < array.length; i++) {    result.push(transform(array[i]));  }  return result;}

The map function above is an example of a higher-order function. It takes an array and a transform function as arguments. It applies the transform function to each element in the array and returns a new array containing the transformed values.

## Currying​

Currying is the process of converting a function that takes multiple arguments into a sequence of functions, each taking a single argument. It allows partial application of arguments, resulting in the creation of new functions.

function multiply(a) {  return function (b) {    return a * b;  };}

In the example above, the multiply function is curried. It takes an argument a and returns a new function that takes another argument b and multiplies it with a. This curried function can be partially applied to create new specialized functions.

## Mapping​

Mapping is a functional programming technique that applies a given transformation to each element of a collection and returns a new collection with the transformed values.

const numbers = [1, 2, 3, 4, 5];const squaredNumbers = numbers.map((x) => x * x);

In the example above, the map function is used to square each element in the numbers array. It returns a new array squaredNumbers with the squared values [1, 4, 9, 16, 25].

## Filter​

Filtering is a functional programming technique that selects elements from a collection based on a given condition and returns a new collection with the selected elements.

const numbers = [1, 2, 3, 4, 5];const evenNumbers = numbers.filter((x) => x % 2 === 0);

In the example above, the filter function is used to select only the even numbers from the numbers array. It returns a new array evenNumbers with the even values [2, 4].

## Reduce​

Reducing is a functional programming technique that applies a given operation to a collection and accumulates the result into a single value.

const numbers = [1, 2, 3, 4, 5];const sum = numbers.reduce((acc, x) => acc + x, 0);

In the example above, the reduce function is used to calculate the sum of all

the numbers in the numbers array. It starts with an initial value of 0 and iteratively adds each element to the accumulator acc.

## Immutability​

Immutability is a concept in functional programming where data structures, once created, cannot be modified. Instead, new data structures are created with the desired changes.

const numbers = [1, 2, 3];const doubledNumbers = numbers.map((x) => x * 2);

In the example above, the original numbers array is not modified. Instead, the map function creates a new array doubledNumbers with each element doubled. This ensures immutability and avoids unintended side effects.

I hope this cheat sheet on Functional JavaScript helps you understand the essential concepts and techniques involved. Feel free to explore the provided internal links for further learning on related topics. Happy programming!

## Immutability​

Immutability is a concept in functional programming where data structures, once created, cannot be modified. Instead, new data structures are created with the desired changes. In JavaScript, primitive types such as numbers and strings are immutable by default, meaning their values cannot be changed once assigned. However, objects and arrays are mutable, allowing modifications to their properties or elements.

### Immutability with Primitive Types​

When using the const declaration in JavaScript, primitive types are assigned as immutable values. This means you cannot reassign a new value to the same variable, but it doesn't prevent you from modifying the value itself.

const number = 5;number = 10; // Throws an error, as you cannot reassign a new value to number

### Immutability with Objects and Arrays​

Unlike primitive types, objects and arrays in JavaScript are mutable, even when declared with const. While you cannot reassign a new object or array to the same variable, you can modify their properties or elements.

const person = { name: 'John', age: 25 };person.name = 'Jane'; // Valid, modifies the name property of person

To achieve immutability with objects and arrays, libraries like Immutable.js can be used. Immutable.js provides immutable data structures that efficiently manage updates by creating new copies of data instead of mutating existing data.

import { Map } from 'immutable';const person = Map({ name: 'John', age: 25 });const updatedPerson = person.set('name', 'Jane');console.log(person.get('name')); // Output: Johnconsole.log(updatedPerson.get('name')); // Output: Jane

In the example above, the Map from Immutable.js is used to create an immutable person object. The set method returns a new Map object with the updated value for the specified key. The original person object remains unchanged, ensuring immutability.

By leveraging libraries like Immutable.js, you can embrace immutability in JavaScript and reap the benefits of predictable data structures and state management in functional programming.