Ab ES2015 gibt es zwei Methoden.
Dieses Objekt ist in Funktionen integriert und verweist entsprechend auf die Argumente einer Funktion. Da es sich technisch gesehen jedoch nicht um ein Array handelt, funktionieren typische Array-Operationen nicht. Die vorgeschlagene Methode besteht darin, mit Array.from
dem Spread-Operator ein Array daraus zu erstellen.
Ich habe andere Antworten gesehen, die die Verwendung erwähnen slice
. Tu das nicht. Es verhindert Optimierungen (Quelle: MDN ).
Array.from(arguments)
[...arguments]
Ich würde jedoch argumentieren, dass dies arguments
problematisch ist, da es verbirgt, was eine Funktion als Eingabe akzeptiert. Eine arguments
Funktion ist normalerweise folgendermaßen geschrieben:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Manchmal wird der Funktionsheader wie folgt geschrieben, um die Argumente C-ähnlich zu dokumentieren:
function mean(/* ... */){ ... }
Das ist aber selten.
Nehmen Sie zum Beispiel C, warum dies problematisch ist. C ist abwärtskompatibel mit einem alten Prä-ANSI-Dialekt der Sprache K & R C. Mit K & R C können Funktionsprototypen eine leere Argumentliste haben.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C bietet die Möglichkeit, varargs
( ...
) und void
eine leere Argumentliste anzugeben.
int myFunction(void);
/* This function accepts no parameters */
Viele Leute deklarieren versehentlich Funktionen mit einer unspecified
Argumentliste ( int myfunction();
), wenn sie erwarten, dass die Funktion keine Argumente akzeptiert. Dies ist technisch gesehen ein Fehler , weil die Funktion wird Argumente akzeptieren. Beliebig viele von ihnen.
Eine ordnungsgemäße varargs
Funktion in C hat folgende Form:
int myFunction(int nargs, ...);
Und JavaScript hat tatsächlich etwas Ähnliches.
Ich habe Ihnen den Spread-Operator bereits gezeigt.
...name
Es ist ziemlich vielseitig und kann auch in der Argumentliste einer Funktion ("Restparameter") verwendet werden, um Varargs auf gut dokumentierte Weise anzugeben:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Oder als Lambda-Ausdruck:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Ich bevorzuge den Spread-Operator. Es ist sauber und selbstdokumentierend.
for - in
Schleife mit demarguments
Objektlength
zu verwenden