Hay dos métodos a partir de ES2015.
Este objeto está integrado en funciones, y se refiere, apropiadamente, a los argumentos de una función. Sin embargo, técnicamente no es una matriz, por lo que las operaciones de matriz típicas no funcionarán en ella. El método sugerido es usar Array.from
el operador de propagación para crear una matriz a partir de él.
He visto otras respuestas mencionar el uso slice
. No hagas eso. Impide optimizaciones (fuente: MDN ).
Array.from(arguments)
[...arguments]
Sin embargo, diría que arguments
es problemático porque oculta lo que una función acepta como entrada. Una arguments
función típicamente se escribe así:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
A veces, el encabezado de la función se escribe de la siguiente manera para documentar los argumentos en forma de C:
function mean(/* ... */){ ... }
Pero eso es raro.
En cuanto a por qué es problemático, tome C, por ejemplo. C es retrocompatible con un antiguo dialecto pre-ANSI del lenguaje conocido como K&R C. K&R C permite que los prototipos de funciones tengan una lista de argumentos vacía.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C proporciona una función para varargs
( ...
) y void
para especificar una lista de argumentos vacía.
int myFunction(void);
/* This function accepts no parameters */
Muchas personas declaran inadvertidamente funciones con una unspecified
lista de argumentos ( int myfunction();
), cuando esperan que la función tome cero argumentos. Esto es técnicamente un error debido a que la función de la voluntad aceptar los argumentos. Cualquier número de ellos.
Una varargs
función adecuada en C toma la forma:
int myFunction(int nargs, ...);
Y JavaScript en realidad tiene algo similar a esto.
Ya te he mostrado el operador de propagación, en realidad.
...name
Es bastante versátil y también se puede usar en la lista de argumentos de una función ("parámetros de reposo") para especificar varargs de una manera bien documentada:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
O como una expresión lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Prefiero mucho el operador de propagación. Es limpio y autodocumentado.
for - in
bucle con elarguments
objeto: en su lugarlength
, debe usarse un 'normal' para iterar el bucle sobre la propiedad