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.fromel 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 argumentses problemático porque oculta lo que una función acepta como entrada. Una argumentsfunció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 voidpara especificar una lista de argumentos vacía.
int myFunction(void);
/* This function accepts no parameters */
Muchas personas declaran inadvertidamente funciones con una unspecifiedlista 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 varargsfunció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 - inbucle con elargumentsobjeto: en su lugarlength, debe usarse un 'normal' para iterar el bucle sobre la propiedad