Od ES2015 istnieją dwie metody.
Ten obiekt jest wbudowany w funkcje i odpowiednio odwołuje się do argumentów funkcji. Jednak technicznie nie jest to tablica, więc typowe operacje tablicowe nie będą na niej działać. Sugerowaną metodą jest użycie Array.fromlub operatora spreadu w celu utworzenia z niego tablicy.
Widziałem inne odpowiedzi, w których wspominano o użyciu slice. Nie rób tego. Zapobiega optymalizacjom (źródło: MDN ).
Array.from(arguments)
[...arguments]
Jednak uważam, że argumentsjest to problematyczne, ponieważ ukrywa to, co funkcja przyjmuje jako dane wejściowe. argumentsFunkcja zwykle jest napisane tak:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Czasami nagłówek funkcji jest zapisywany w następujący sposób, aby udokumentować argumenty w sposób podobny do C:
function mean(/* ... */){ ... }
Ale to rzadkie.
Jeśli chodzi o powody, dla których jest to problematyczne, weźmy na przykład C. C jest wstecznie kompatybilny ze starożytnym dialektem języka sprzed ANSI znanym jako K&R C. K&R C pozwala prototypom funkcji mieć pustą listę argumentów.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C udostępnia funkcję varargs( ...) i voidokreśla pustą listę argumentów.
int myFunction(void);
/* This function accepts no parameters */
Wiele osób nieumyślnie deklaruje funkcje z unspecifiedlistą argumentów ( int myfunction();), gdy oczekują, że funkcja przyjmuje zero argumentów. Jest to technicznie to błąd, ponieważ funkcja będzie akceptować argumenty. Dowolna ich liczba.
Właściwa varargsfunkcja w C ma postać:
int myFunction(int nargs, ...);
A JavaScript faktycznie ma coś podobnego.
Właściwie już pokazałem wam operator spreadu.
...name
Jest dość wszechstronny i może być również użyty na liście argumentów funkcji ("parametry reszty"), aby określić varargs w ładnie udokumentowany sposób:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Lub jako wyrażenie lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
O wiele bardziej wolę operatora rozprzestrzeniania. Jest czysty i samodokumentujący.
for - inpętli zargumentsobiektem -lengthzamiast tego należy użyć „normalnej” pętli for iterującej po właściwości