Entiendo el caso en que una función puede tener menos argumentos de los que permite la firma de la función, como:
function sum(x, y=1) { return x+y; } console.log(sum(5));O más parámetros si es una función vargs/rest:
function sum(...rest) { let s = 0; for (let n of rest) s += n; return s; } console.log(sum(1,2,3,4,5));Pero, ¿por qué lo siguiente no genera un error?
'use strict'; function addEmUp() { let sum = 0; for (let arg of arguments) sum += arg; return sum; } console.log(addEmUp(1,2,3,4,5));Los valores predeterminados para los parámetros y el resto de los parámetros son una funcionalidad relativamente nueva de JavaScript, se introdujeron en ES2015 . Antes de eso, la única forma de tener una función con cualquier cantidad de argumentos era usando el objeto arguments . Ha estado disponible desde las primeras versiones de JavaScript.
No importa cómo acceda una función a sus parámetros reales, se puede llamar con menos o más parámetros de los que requiere su declaración. Cuando hay menos valores reales que los parámetros declarados en la llamada, los parámetros restantes no se inicializan (su valor no está undefined ), cuando se llama a la función con más valores de los declarados, solo se puede acceder a los valores adicionales usando los arguments objeto (o con el resto de la sintaxis).