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 iterierbares Objekt wie ein Array oder eine Zeichenkette an Stellen zu erweitern, an denen null oder mehr Argumente (für Funktionsaufrufe) oder Elemente (für Array-Literale) erwartet werden. In einem Objekt-Literal enumeriert die Spread-Syntax die Eigenschaften eines Objekts und fügt die Schlüssel-Wert-Paare zum erstellten Objekt hinzu.
Die Spread-Syntax sieht genauso aus wie die Rest-Syntax. 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 "verdichtet". Siehe Rest-Parameter und Rest-Eigenschaft.
Die Spread-Syntax kann verwendet werden, wenn alle Elemente aus einem Objekt oder Array in ein neues Array oder Objekt aufgenommen werden sollen oder wenn sie nacheinander in der Argumentliste eines Funktionsaufrufs angewendet werden sollen. Es gibt drei verschiedene Stellen, die die Spread-Syntax akzeptieren:
Obwohl die Syntax gleich aussieht, haben sie leicht unterschiedliche Semantiken.
Nur iterierbare Werte wie Array und String können in Array-Literalen und Argumentlisten verwendet werden. Viele Objekte sind nicht iterierbar, einschließlich aller normalen Objekte, denen eine Symbol.iterator-Methode fehlt:
Andererseits enumeriert die Verwendung der Spread-Syntax in Objekt-Literalen die eigenen Eigenschaften des Werts. Für typische Arrays sind alle Indizes zählbare eigene Eigenschaften, sodass Arrays in Objekte umgewandelt werden können.
Alle Primitive können in Objekten verwendet werden. Nur Strings haben eigene zählbare Eigenschaften, und das Verwenden anderer Werte erzeugt keine Eigenschaften im neuen Objekt.
Bei der Verwendung der Spread-Syntax für Funktionsaufrufe sollte beachtet werden, dass die Möglichkeit besteht, 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 die Elemente eines Arrays als Argumente einer Funktion verwendet werden sollen.
Mit der Spread-Syntax kann das Obige wie folgt geschrieben werden:
Jedes Argument in der Argumentliste kann die Spread-Syntax verwenden, und die Spread-Syntax kann mehrfach verwendet werden.
Beim Aufrufen eines Konstruktors mit new ist es nicht möglich, direkt ein Array und apply() zu verwenden, da apply() die Zielfunktion aufruft anstatt sie zu konstruieren, was unter anderem bedeutet, dass new.target undefined sein wird. Ein Array kann jedoch dank der Spread-Syntax leicht mit new verwendet werden:
Ohne Spread-Syntax reicht die Array-Literal-Syntax nicht mehr aus, um ein neues Array mit einem bestehenden Array als Teil davon zu erstellen. Stattdessen muss imperativer Code mit einer Kombination von Methoden wie push(), splice(), concat() usw. verwendet werden. Mit der Spread-Syntax wird dies viel prägnanter:
Genau wie bei Argumentlisten kann ... überall im Array-Literal verwendet werden und auch mehrmals vorkommen.
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 beim Kopieren eines Arrays effektiv eine Ebene tief. Daher kann sie ungeeignet sein, um mehrdimensionale Arrays zu kopieren. Das Gleiche gilt für Object.assign() — keine native Operation in JavaScript führt eine tiefe Kopie durch. Die Web-API-Methode structuredClone() erlaubt das tiefe Kopieren von Werten bestimmter unterstützter Typen. Siehe flache Kopie für weitere Details.
Array.prototype.concat() wird oft verwendet, um ein Array an das Ende eines bestehenden Arrays anzuhängen. Ohne Spread-Syntax geschieht dies wie folgt:
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 geschieht dies wie folgt:
Mit Spread-Syntax wird daraus:
Hinweis: Im Gegensatz zu unshift() wird ein neues arr1 erstellt, anstatt das ursprüngliche arr1-Array direkt zu ändern.
Sie können ein Element in einem Array-Literal je nach einer Bedingung vorhanden oder nicht vorhanden machen, indem Sie einen bedingten Operator verwenden.
Wenn die Bedingung false ist, verwenden wir ein leeres Array, sodass nichts dem endgültigen Array hinzugefügt wird. Beachten Sie, dass dies anders ist als das Folgende:
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 ein neues Objekt zusammenzuführen.
Ein einzelnes Spread erstellt eine flache Kopie des ursprünglichen Objekts (jedoch ohne nicht-zählbare Eigenschaften und ohne das Prototyp zu kopieren), ähnlich wie Kopieren eines Arrays.
Wenn ein Objekt in ein anderes Objekt eingefügt wird oder wenn mehrere Objekte in ein Objekt eingefügt werden und Eigenschaften mit identischen Namen auftreten, nimmt die Eigenschaft den zuletzt zugewiesenen Wert an, bleibt jedoch in der ursprünglich festgelegten Position.
Sie können ein Element in einem Objekt-Literal je nach einer Bedingung vorhanden oder nicht vorhanden machen, indem Sie einen bedingten Operator verwenden.
Der Fall, wenn die Bedingung false ist, ergibt ein leeres Objekt, sodass nichts in das endgültige Objekt eingefügt wird. Beachten Sie, dass dies anders ist als das Folgende:
In diesem Fall ist die watermelon-Eigenschaft immer vorhanden und wird von Methoden wie Object.keys() besucht.
Da auch Primitive in Objekte eingefügt werden können, und aus der Beobachtung, dass alle falschen Werte keine zählbaren Eigenschaften haben, können Sie einfach einen logischen UND-Operator verwenden:
In diesem Fall wird keine Eigenschaft auf dem fruits-Objekt erstellt, wenn isSummer ein falscher Wert ist.
Beachten Sie, dass Object.assign() verwendet werden kann, um ein Objekt zu mutieren, während die Spread-Syntax dies nicht kann.
Außerdem löst Object.assign() Setter im Zielobjekt aus, während die Spread-Syntax dies nicht tut.
Sie können die Object.assign()-Funktion nicht naiv durch ein einfaches Spreizen nachbilden:
Im obigen Beispiel funktioniert die Spread-Syntax nicht wie erwartet: Sie zerlegt ein Array von Argumenten in das Objekt-Literal aufgrund des Rest-Parameters. Hier ist eine Implementierung von merge unter Verwendung der Spread-Syntax, deren Verhalten ähnlich wie bei Object.assign() ist, mit der Ausnahme, dass sie keine Setter auslöst und kein Objekt mutiert:
| 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.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.