Mit der Rest Parameter Syntax kann man beliebig viele Parameter als Array empfangen.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
function f(a, b, ...restArgs) {
// ...
}
Beschreibung
Wenn vor dem letzten Parameter einer Funktion ... steht wird aus diesem Parameter ein Array von 0 (inklusiv) bis zu restArgs.length (exklusiv), welches weitere der Funktion übergebene Parameter enthält.
Im oberen Beispiel enthält das restArgs alle weiteren Argumente außer die ersten beiden, da diese bereits von den Variablen a und b erfasst werden.
Unterschiede zwischen Rest Parametern und dem arguments Objekt
Es gibt drei Hauptunterschiede zwischen Rest Parametern und dem arguments Objekt:
- Rest Parameter sind nur die jenigen, die zu einem Namen gehören (z. B. in Funktionsausdrücken formal definierte Parameter), während das
argumentsObjekt alle übergebenen Argumente einer Funktion enthällt. - Das
argumentsObjekt ist kein echtes Array, während Rest Parameter eineArraysind, was bedeutet, dass Methoden wiesort,map,forEachoderpopdirekt angewendet werden können. - Das
argumentsObjekt hat zusätzliche, spezielle Funktionalität (wie diecalleeEigenschaft).
Von arguments zu einem Array
Rest Parameter wurden eingeführt, um Standardcode zu reduzieren, welche beim Einsatz von arguments anfällt
// Before rest parameters, the following could be found:
function f(a, b) {
var args = Array.prototype.slice.call(arguments, f.length);
// …
}
// to be equivalent of
function f(a, b, ...args) {
}
Destrukturierte Rest Parameter
Rest Parameter können destrukturiert werden, was bedeutet, dass sie in einzelne Variablen entpackt werden können. Siehe destrukturierende Zuweisung.
function f(...[a, b, c]) {
return a + b + c;
}
f(1) // NaN (b and c are undefined)
f(1, 2, 3) // 6
f(1, 2, 3, 4) // 6 (the fourth parameter is not destructured)
Beispiele
Weil theArgs ein Array ist, ist die Anzahl der Argumente mit der length Eigenschaft gegeben:
function fun1(...theArgs) {
console.log(theArgs.length);
}
fun1(); // 0
fun1(5); // 1
fun1(5, 6, 7); // 3
Im nächsten Beispiel wird ein Rest Parameter eingesetzt, um alle Argumente außer dem ersten in einem Array zu sammeln. Jedes wird dann mit dem ersten Argument multipliziert und als Array zurückgegeben:
function multiply(multiplier, ...theArgs) {
return theArgs.map(function(element) {
return multiplier * element;
});
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]
Das folgende Beispiel zeigt, dass Array Methoden auf Rest Parameter jedoch nicht auf arguments Objekten eingesetzt werden können:
function sortRestArgs(...theArgs) {
var sortedArgs = theArgs.sort();
return sortedArgs;
}
console.log(sortRestArgs(5, 3, 7, 1)); // shows 1, 3, 5, 7
function sortArguments() {
var sortedArgs = arguments.sort();
return sortedArgs; // this will never happen
}
// throws a TypeError: arguments.sort is not a function
console.log(sortArguments(5, 3, 7, 1));
Um Array Methoden auf einem arguments Objekt zu benutzen, muss dieses in ein echtes Array konvertiert werden.
function sortArguments() {
var args = Array.from(arguments);
var sortedArgs = args.sort();
return sortedArgs;
}
console.log(sortArguments(5, 3, 7, 1)); // 1, 3, 5, 7
Spezifikationen
| Spezifikation | Status | Kommentar |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Function Definitions' in dieser Spezifikation. |
Standard | Initiale Definition |
| ECMAScript Latest Draft (ECMA-262) Die Definition von 'Function Definitions' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Rest parameters | Chrome Vollständige Unterstützung 47 | Edge Vollständige Unterstützung 12 | Firefox Vollständige Unterstützung 15 | IE Keine Unterstützung Nein | Opera Vollständige Unterstützung 34 | Safari Vollständige Unterstützung 10 | WebView Android Vollständige Unterstützung 47 | Chrome Android Vollständige Unterstützung 47 | Firefox Android Vollständige Unterstützung 15 | Opera Android Vollständige Unterstützung 34 | Safari iOS Vollständige Unterstützung 10 | Samsung Internet Android Vollständige Unterstützung 5.0 | nodejs
Vollständige Unterstützung
6.0.0
|
| Destructuring rest parameters | Chrome Vollständige Unterstützung 49 | Edge Keine Unterstützung Nein | Firefox Vollständige Unterstützung 52 | IE Keine Unterstützung Nein | Opera Vollständige Unterstützung 36 | Safari ? | WebView Android Vollständige Unterstützung 49 | Chrome Android Vollständige Unterstützung 49 | Firefox Android Vollständige Unterstützung 52 | Opera Android Vollständige Unterstützung 36 | Safari iOS ? | Samsung Internet Android Vollständige Unterstützung 5.0 | nodejs Vollständige Unterstützung Ja |
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Keine Unterstützung
- Keine Unterstützung
- Kompatibilität unbekannt
- Kompatibilität unbekannt
- Benutzer muss dieses Feature explizit aktivieren.
- Benutzer muss dieses Feature explizit aktivieren.