Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Oktober 2015 browserübergreifend verfügbar.
Die Spread-Syntax (...) ermöglicht es, ein Iterables, wie ein Array oder einen String, an Stellen zu erweitern, an denen null oder mehr Argumente (bei Funktionsaufrufen) oder Elemente (bei Array-Literalen) erwartet werden. In einem Objektliteral enumeriert die Spread-Syntax die Eigenschaften eines Objekts und fügt die Schlüssel-Wert-Paare dem erstellten Objekt hinzu.
Die Spread-Syntax sieht genau wie die Rest-Syntax aus. In gewisser Weise ist die Spread-Syntax das Gegenteil der Rest-Syntax. Die Spread-Syntax "erweitert" ein Array in seine Elemente, während die Rest-Syntax mehrere Elemente sammelt und in ein einziges Element "kondensiert". Siehe Restparameter und Rest-Eigenschaft.
Spread-Syntax kann verwendet werden, wenn alle Elemente aus einem Objekt oder Array in einem neuen Array oder Objekt enthalten sein sollen oder einzeln in einer Argumentenliste eines Funktionsaufrufs angewendet werden sollen. Es gibt drei verschiedene Orte, die die Spread-Syntax akzeptieren:
Obwohl die Syntax gleich aussieht, haben sie leicht unterschiedliche Semantiken.
Nur iterable Werte, wie Array und String, können in Array-Literalen und Argumentenlisten erweitert werden. Viele Objekte sind nicht iterierbar, einschließlich aller einfachen Objekte, die keine Symbol.iterator Methode besitzen:
Andererseits enumeriert das Erweitern in Objektliteralen die eigenen Eigenschaften des Werts. Bei typischen Arrays sind alle Indizes aufzählbare eigene Eigenschaften, sodass Arrays in Objekte übertragen werden können.
Alle Primitive können in Objekten erweitert werden. Nur Strings haben aufzählbare eigene Eigenschaften, und das Erweitern von allem anderen erstellt keine Eigenschaften im neuen Objekt.
Wenn Sie die Spread-Syntax für Funktionsaufrufe verwenden, beachten Sie die Möglichkeit, das Argumentlängenlimit der JavaScript-Engine zu überschreiten. Siehe Function.prototype.apply() für weitere Details.
Es ist üblich, Function.prototype.apply() in Fällen zu verwenden, in denen Sie die Elemente eines Arrays als Argumente an eine Funktion übergeben möchten.
Mit Spread-Syntax kann das oben stehende wie folgt geschrieben werden:
Jedes Argument in der Argumentenliste kann die Spread-Syntax verwenden, und die Spread-Syntax kann mehrmals verwendet werden.
Beim Aufrufen eines Konstruktors mit new ist es nicht möglich, ein Array und apply() direkt zu verwenden, da apply() die Zielmethode aufruft, anstatt sie zu konstruieren, was unter anderem bedeutet, dass new.target undefined sein wird. Dank der Spread-Syntax kann ein Array jedoch problemlos mit new verwendet werden:
Ohne Spread-Syntax reicht die Array-Literal-Syntax nicht mehr aus, um ein neues Array mit einem vorhandenen Array als Teil davon zu erstellen. Stattdessen muss imperativer Code verwendet werden, der eine Kombination aus Methoden wie push(), splice(), concat() usw. beinhaltet. Mit Spread-Syntax wird dies viel knapper:
Genau wie bei der Spread-Syntax für Argumentenlisten kann ... überall im Array-Literal verwendet werden und kann mehrmals verwendet werden.
Sie können die Spread-Syntax verwenden, um eine flache Kopie eines Arrays zu erstellen. Jedes Array-Element behält seine Identität bei, ohne kopiert zu werden.
Die Spread-Syntax geht effektiv eine Ebene tief beim Kopieren eines Arrays. Daher ist sie möglicherweise nicht geeignet zum Kopieren mehrdimensionaler Arrays. Dasselbe gilt für Object.assign() — keine native Operation in JavaScript führt ein Deep-Klonen durch. Die Web-API-Methode structuredClone() ermöglicht das tiefe Kopieren von Werten bestimmter unterstützter Typen. Weitere Details finden Sie unter flache Kopie.
Array.prototype.concat() wird oft verwendet, um ein Array an das Ende eines bestehenden Arrays anzufügen. Ohne Spread-Syntax wird dies so gemacht:
Mit Spread-Syntax wird daraus:
Array.prototype.unshift() wird oft verwendet, um ein Array von Werten am Anfang eines bestehenden Arrays einzufügen. Ohne Spread-Syntax wird dies so gemacht:
Mit Spread-Syntax wird daraus:
Hinweis: Im Gegensatz zu unshift() wird hierbei ein neues arr1 erstellt, anstatt das ursprüngliche Array arr1 direkt zu verändern.
Sie können ein Element in einem Array-Literal abhängig von einer Bedingung vorhanden oder abwesend machen, indem Sie einen Bedingungsoperator verwenden.
Wenn die Bedingung false ist, erweitern wir ein leeres Array, sodass nichts zum endgültigen Array hinzugefügt wird. Beachten Sie, dass dies anders ist als Folgendes:
In diesem Fall wird ein zusätzliches undefined-Element hinzugefügt, wenn isSummer false ist, und dieses Element wird von Methoden wie Array.prototype.map() besucht.
Sie können die Spread-Syntax verwenden, um mehrere Objekte in einem neuen Objekt zusammenzuführen.
Ein einzelnes Spread erstellt eine flache Kopie des ursprünglichen Objekts (aber ohne nicht-auflistbare Eigenschaften und ohne das Prototypenobjekt zu kopieren), ähnlich wie beim Kopieren eines Arrays.
Wenn ein Objekt in ein anderes Objekt erweitert wird, oder wenn mehrere Objekte in ein Objekt erweitert werden und dabei Eigenschaften mit identischen Namen aufeinandertreffen, nimmt die Eigenschaft den zuletzt zugewiesenen Wert an und bleibt an der Position, an der sie ursprünglich gesetzt wurde.
Sie können ein Element in einem Objektliteral abhängig von einer Bedingung vorhanden oder abwesend machen, indem Sie einen Bedingungsoperator verwenden.
Der Fall, in dem die Bedingung false ist, ist ein leeres Objekt, so dass nichts in das endgültige Objekt erweitert wird. Beachten Sie, dass dies anders ist als Folgendes:
In diesem Fall ist die watermelon-Eigenschaft immer vorhanden und wird von Methoden wie Object.keys() besucht.
Da auch Primitive in Objekte erweitert werden können, und aus der Beobachtung heraus, dass alle falsy Werte keine auflistbaren Eigenschaften besitzen, können Sie einfach einen logischen UND Operator verwenden:
In diesem Fall, wenn isSummer irgendein falsy Wert ist, wird keine Eigenschaft im fruits-Objekt erstellt.
Beachten Sie, dass Object.assign() verwendet werden kann, um ein Objekt zu verändern, während die Spread-Syntax dies nicht kann.
Zusätzlich löst Object.assign() Setter auf dem Zielobjekt aus, während die Spread-Syntax dies nicht tut.
Sie können die Object.assign() Funktion nicht naiv durch ein einfaches Erweitern nachbilden:
Im obigen Beispiel funktioniert die Spread-Syntax nicht wie erwartet: Sie erweitert ein Array von Argumenten in das Objektliteral, aufgrund des Restparameters. Hier ist eine Implementierung von merge mit der Spread-Syntax, deren Verhalten ähnlich wie Object.assign() ist, außer dass sie keine Setter auslöst, noch irgendein Objekt verändert:
| ECMAScript® 2027 Language Specification # prod-SpreadElement |
| ECMAScript® 2027 Language Specification # prod-ArgumentList |
| ECMAScript® 2027 Language Specification # prod-PropertyDefinition |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.