forEach
que viene incluída por defecto en todos los arreglos de JavaScript:forEach
utiliza for
para hacer el recorrido de los elementos. No es que la programación funcional reemplace la programación imperativa, la programación funcional está un nivel por encima de la programación imperativa.map
, que nos permite transformar cada uno de los elementos de un arreglo. Por ejemplo, imagina que queremos duplicar todos los valores de arr
:reduce
que se utiliza precisamente para esto. Por ejemplo, si queremos sumar todos los elementos en arr
podemos hacer lo siguiente:reduce
recibe un callback (una función) y, opcionalmente, un valor inicial. El callback recibe dos parámetros: un acumulador y un elemento. Lo que retorne el callback se va a utilizar como el acumulador del siguiente elemento. En nuestro caso vamos acumulando la suma.reduce
para operaciones un poco más complejas. Por ejemplo para contar cuantas veces se repite cada caracter en una cadena de texto:split
hace que la cadena se convierta en un arreglo que podemos utilizar para contar las letras (utilizando el reduce
). Al reduce
le estamos pasando un objeto vacío como valor inicial (línea 5). En cada iteración del reduce
verificamos si la letra existe como propiedad del objeto. Si existe, le sumamos 1 a esa propiedad, de lo contrario la creamos y le asignamos el valor 1. Por último retornamos el objeto actualizado.hello
recibe un argumento (un nombre) y retorna una nueva función. En la línea 7 estamos almacenando la función retornada en una variable llamada helloMaria
que después invocamos. También es posible evitarnos la asignación a una nueva variable e invocar la función retornada inmediatamente como lo hacemos en la línea 11.bind
(explicado en la guía Uso del this) retorna otra función que garantiza que la función original siempre se ejecute en el contexto adecuado.called
que nos va a decir si la función ya se invocó y result
en donde vamos a almacenar el resultado de la función. Después retornamos una nueva función que hace todo el trabajo pesado: si la función no ha sido invocada la invoca, cambia called
a true
y almacena el resultado en result
. Por último, en la línea 10, retornamos el resultado.const
en el caso de variables y crear un nuevo arreglo u objeto cuando se necesite modificarlos.str
nunca cambia, los métodos slice
y toUpperCase
retornan nuevos strings.push
, shift
y splice
) y otros que retornan un nuevo arreglo (p.e. concat
, map
y filter
).