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.from
lub 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 arguments
jest to problematyczne, ponieważ ukrywa to, co funkcja przyjmuje jako dane wejściowe. arguments
Funkcja 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 void
określa pustą listę argumentów.
int myFunction(void);
/* This function accepts no parameters */
Wiele osób nieumyślnie deklaruje funkcje z unspecified
listą 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 varargs
funkcja 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 - in
pętli zarguments
obiektem -length
zamiast tego należy użyć „normalnej” pętli for iterującej po właściwości