Esistono due metodi a partire da ES2015.
Questo oggetto è incorporato in funzioni e fa riferimento, in modo appropriato, agli argomenti di una funzione. Tecnicamente non è un array, quindi le operazioni tipiche dell'array non funzionano su di esso. Il metodo suggerito è utilizzare Array.from
o l'operatore spread per creare un array da esso.
Ho visto altre risposte menzionate usando slice
. Non farlo. Previene le ottimizzazioni (fonte: MDN ).
Array.from(arguments)
[...arguments]
Tuttavia, direi che arguments
è problematico perché nasconde ciò che una funzione accetta come input. Una arguments
funzione in genere è scritta come questa:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
A volte, l'intestazione della funzione è scritta come la seguente per documentare gli argomenti in modo simile al C:
function mean(/* ... */){ ... }
Ma è raro.
Per quanto riguarda il motivo per cui è problematico, prendi C, per esempio. C è retrocompatibile con un antico dialetto pre-ANSI del linguaggio noto come K&R C. K&R C consente ai prototipi di funzioni di avere un elenco di argomenti vuoto.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C fornisce una funzione per varargs
( ...
) e void
per specificare un elenco di argomenti vuoto.
int myFunction(void);
/* This function accepts no parameters */
Molte persone dichiarano inavvertitamente funzioni con un unspecified
elenco di argomenti ( int myfunction();
), quando si aspettano che la funzione prenda zero argomenti. Questo è tecnicamente un errore perché la funzione verrà accettare argomenti. Qualsiasi numero di loro.
Una varargs
funzione corretta in C assume la forma:
int myFunction(int nargs, ...);
E JavaScript in realtà ha qualcosa di simile a questo.
In realtà ti ho già mostrato l'operatore di diffusione.
...name
È piuttosto versatile e può anche essere usato nella lista di argomenti di una funzione ("parametri di riposo") per specificare i vararg in modo ben documentato:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
O come espressione lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Preferisco di gran lunga l'operatore di diffusione. È pulito e auto-documentato.
for - in
loop con l'arguments
oggetto - silength
dovrebbe usare invece un 'normale' per loop che scorre la proprietà