Existem dois métodos a partir do ES2015.
Este objeto é incorporado às funções e refere-se, adequadamente, aos argumentos de uma função. Tecnicamente, não é um array, portanto, as operações típicas do array não funcionarão nele. O método sugerido é usar Array.from
ou o operador spread para criar uma matriz a partir dele.
Já vi outras respostas mencionadas usando slice
. Não faça isso. Impede otimizações (fonte: MDN ).
Array.from(arguments)
[...arguments]
No entanto, eu argumentaria que isso arguments
é problemático porque oculta o que uma função aceita como entrada. Uma arguments
função normalmente é escrita assim:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Às vezes, o cabeçalho da função é escrito da seguinte maneira para documentar os argumentos do modo C:
function mean(/* ... */){ ... }
Mas isso é raro.
Por que é problemático, considere C, por exemplo. C é retrocompatível com um dialeto antigo pré-ANSI do idioma conhecido como K&R C. O K&R C permite que os protótipos de função tenham uma lista de argumentos vazia.
int myFunction();
/* This function accepts unspecified parameters */
O ANSI C fornece um recurso para varargs
( ...
) e void
para especificar uma lista de argumentos vazia.
int myFunction(void);
/* This function accepts no parameters */
Muitas pessoas inadvertidamente declaram funções com uma unspecified
lista de argumentos ( int myfunction();
), quando esperam que a função receba zero argumentos. Tecnicamente, isso é um bug, porque a função será aceitar argumentos. Qualquer número deles.
Uma varargs
função adequada em C assume a forma:
int myFunction(int nargs, ...);
E o JavaScript realmente tem algo parecido com isso.
Eu já mostrei o operador spread, na verdade.
...name
É bastante versátil e também pode ser usado na lista de argumentos de uma função ("rest parameters") para especificar varargs de uma maneira bem documentada:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Ou como uma expressão lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Eu prefiro muito o operador spread. É limpo e auto-documentado.
for - in
laço com oarguments
objeto - um 'normal' loop iteração sobre alength
propriedade deve ser usada em vez