JS: Funciones
Teoría: Operador Rest (empaquetar argumentos)
Vamos a intentar implementar una función muy simple que sume números. Para empezar, definamos la función sum(), que toma dos números como entrada y devuelve su suma:
Hasta aquí todo es simple y claro. Sin embargo, surgen dificultades cuando se plantean requisitos adicionales: ¿qué pasa si queremos sumar no dos, sino tres números? ¿O cinco, o incluso diez? Es obviamente una mala opción escribir una función separada para cada caso:
Necesitamos que una única función pueda trabajar con diferentes cantidades de argumentos. ¿Cómo podemos lograr esto?
Podemos observar que en la biblioteca estándar de JavaScript existen funciones que pueden tomar diferentes cantidades de argumentos. Por ejemplo, la firma de la función Math.max() se define de la siguiente manera:
Esto nos dice que en Math.max() se pueden pasar cualquier cantidad de elementos y que no son obligatorios:
Desde el punto de vista de la llamada, no hay nada inusual, simplemente se pasan diferentes números de argumentos. Sin embargo, la definición de una función con un número variable de argumentos se ve inusual:
El símbolo de tres puntos ... antes del nombre del parámetro formal en la definición de la función se llama operador rest. La expresión ...params en la definición de func() del ejemplo anterior significa literalmente lo siguiente: "coloca todos los argumentos pasados en la llamada de la función en el array params".
Si no se pasan argumentos, el array params estará vacío:
Se pueden pasar cualquier cantidad de argumentos a la función, y todos ellos se almacenarán en el array params:
Los argumentos pueden ser de cualquier tipo: números, cadenas, arrays, etc.:
Ahora tenemos suficiente conocimiento para reescribir nuestra función sum() utilizando el operador rest, de modo que pueda sumar cualquier cantidad de números (no solo dos, como hasta ahora):
En este contexto, se puede considerar que el array es un "argumento opcional" que se puede omitir por completo o pasar tantos como se desee. Y si queremos que la función tenga dos parámetros nombrados "obligatorios" y los demás sean opcionales y se almacenen en un array rest, simplemente especificamos los parámetros nombrados formales estándar primero (por ejemplo, a y b) y al final agregamos el array rest:
Lo mismo se puede hacer para un solo argumento:
y para tres:
Esta idea se puede seguir extendiendo, haciendo obligatorio el número de argumentos que se requiera. La única limitación es que el operador rest solo se puede usar para el último parámetro. Es decir, este código es sintácticamente incorrecto:
Y este también:
Es por eso que el operador se llama rest, ya que organiza el almacenamiento de los parámetros "restantes" (últimos).
Completado
0 / 16