10. Destrukturierung
10. Destrukturierung #
- 10.1. Übersicht
- 10.1.1. Objektzerstörung
- 10.1.2. Array-Destrukturierung
- 10.1.3. Wo kann Destrukturierung eingesetzt werden?
- 10.2. Hintergrund: Daten konstruieren versus Daten extrahieren
- 10.3. Muster für die Destrukturierung
- 10.3.1. Wählen Sie, was Sie brauchen
- 10.4. Wie greifen Muster auf die Innereien von Werten zu?
- 10.4.1. Objektmuster zwingen Werte zu Objekten
- 10.4.2. Array-Muster arbeiten mit Iterablen
- 10.5. Standardwerte
- 10.5.1.
undefined
löst Standardwerte aus - 10.5.2. Standardwerte werden bei Bedarf berechnet
- 10.5.3. Standardwerte können sich auf andere Variablen im Muster
- 10.5.4 beziehen. Standardwerte für Muster
- 10.5.5. Komplexere Standardwerte
- 10.5.1.
- 10.6. Weitere Funktionen zur Objektdestrukturierung
- 10.6.1. Eigenschaftswert Abkürzungen
- 10.6.2. Berechnete Eigenschaftsschlüssel
- 10.7. Weitere Array-Destrukturierungsfunktionen
- 10.7.1. Elision
- 10.7.2. Rest-Operator (
...
)
- 10.8. Sie können mehr als nur Variablen zuweisen
- 10.9. Fallstricke der Destrukturierung
- 10.9.1. Beginnen Sie eine Anweisung nicht mit einer geschweiften Klammer
- 10.10. Beispiele für Destrukturierung
- 10.10.1. Destrukturierung zurückgegebene Arrays
- 10.10.2. Destrukturierung zurückgegebener Objekte
- 10.10.3. Array-Destrukturierung iterierbarer Werte
- 10.10.4. Mehrere Rückgabewerte
- 10.11. Der Destrukturierungsalgorithmus
- 10.11.1. Der Algorithmus
- 10.11.2. Anwenden des Algorithmus
10.1 Übersicht #
Die Destrukturierung ist eine bequeme Möglichkeit, mehrere Werte aus Daten zu extrahieren, die in (möglicherweise verschachtelten) Objekten und Arrays gespeichert sind. Es kann an Orten verwendet werden, an denen Daten empfangen werden (z. B. auf der linken Seite einer Zuweisung). Wie die Werte extrahiert werden, wird über Muster angegeben (Beispiele finden Sie weiter).
10.1.1 Objekt-Destrukturierung #
Objekt-Destrukturierung:
Destrukturierung hilft bei der Verarbeitung von Rückgabewerten:
10.1.2 Array-Destrukturierung #
Array-Destrukturierung (funktioniert für alle iterierbaren Werte):
Destrukturierung hilft bei der Verarbeitung von Rückgabewerten:
10.1.3 Wo kann Destrukturierung eingesetzt werden? #
Destrukturierung kann an den folgenden Stellen verwendet werden (ich zeige Array-Muster, um zu demonstrieren; Objektmuster funktionieren genauso gut):
Sie können auch in einer for-of
-Schleife destrukturieren:
10.2 Hintergrund: Konstruieren von Daten im Vergleich zum Extrahieren von Daten #
Um vollständig zu verstehen, was Destrukturierung ist, untersuchen wir zunächst den breiteren Kontext.
JavaScript verfügt über Operationen zum Erstellen von Daten, jeweils eine Eigenschaft:
Die gleiche Syntax kann zum Extrahieren von Daten verwendet werden. Wieder eine Eigenschaft nach der anderen:
Darüber hinaus gibt es eine Syntax zum gleichzeitigen Erstellen mehrerer Eigenschaften über ein Objektliteral:
Vor ES6 gab es keinen entsprechenden Mechanismus zum Extrahieren von Daten. Das ist es, was Destrukturierung ist – Sie können mehrere Eigenschaften aus einem Objekt über ein Objektmuster extrahieren. Zum Beispiel auf der linken Seite einer Zuweisung:
Sie können Arrays auch über Muster zerstören:
10.3 Muster für die Destrukturierung #
Die folgenden zwei Parteien sind an der Destrukturierung beteiligt:
- Destrukturierungsquelle: Die Daten, die destrukturiert werden sollen. Zum Beispiel die rechte Seite einer Destrukturierungszuweisung.
- Destrukturierungsziel: das Muster, das für die Destrukturierung verwendet wird. Zum Beispiel die linke Seite einer Destrukturierungszuweisung.
Das Destrukturierungsziel ist eines von drei Mustern:
- Zuordnung Ziel. Zum Beispiel:
x
- Ein Zuweisungsziel ist normalerweise eine Variable. Bei der Destrukturierungszuweisung haben Sie jedoch mehr Optionen, wie ich später erläutern werde.
- Objekt Muster. Zum Beispiel:
{ first: "pattern", last: "pattern" }
- Die Teile eines Objektmusters sind Eigenschaften, die Eigenschaftswerte sind wiederum Muster (rekursiv).
- Array-Muster. Zum Beispiel:
- Die Teile eines Array-Musters sind Elemente, die Elemente sind wiederum Muster (rekursiv).
Das bedeutet, dass Sie Muster beliebig verschachteln können.:
10.3.1 Wählen Sie, was Sie brauchen #
Wenn Sie ein Objekt zerstören, erwähnen Sie nur die Eigenschaften, an denen Sie interessiert sind:
Wenn Sie ein Array zerstören, können Sie nur ein Präfix extrahieren:
10.4 Wie greifen Muster auf die Innereien von Werten zu? #
Wie greift der pattern
in einer Zuweisung pattern = someValue
auf das zu, was sich in someValue
befindet?
10.4.1 Objektmuster zwingen Werte zu Objekten #
Das Objektmuster zwingt Destrukturierungsquellen zu Objekten, bevor auf Eigenschaften zugegriffen wird. Das bedeutet, dass es mit primitiven Werten funktioniert:
10.4.1.1 Fehler bei der Objektdestruktur eines Werts #
Der Zwang zum Objekt wird nicht über Object()
, sondern über die interne Operation ToObject()
ausgeführt. Die beiden Operationen behandeln undefined
und null
unterschiedlich.
Object()
konvertiert primitive Werte in Wrapper-Objekte und lässt Objekte unberührt:
It also converts undefined
and null
to empty objects:
In contrast, ToObject()
throws a TypeError
if it encounters undefined
or null
. Therefore, the following destructurings fail, even before destructuring accesses any properties:
Daher können Sie das leere Objektmuster {}
verwenden, um zu überprüfen, ob ein Wert für ein Objekt erzwungen werden kann. Wie wir gesehen haben, sind nur undefined
und null
nicht:
Die Klammern um die Ausdrücke sind notwendig, da Anweisungen in JavaScript nicht mit geschweiften Klammern beginnen dürfen (Details werden später erläutert).
10.4.2 Array-Muster arbeiten mit Iterablen #
Die Array-Destrukturierung verwendet einen Iterator, um zu den Elementen einer Quelle zu gelangen. Daher können Sie jeden iterierbaren Wert Array-destrukturieren. Schauen wir uns Beispiele für iterierbare Werte an.
Strings sind iterierbar:
Vergessen Sie nicht, dass der Iterator über Zeichenfolgen Codepunkte („Unicode-Zeichen“, 21 Bit) und keine Codeeinheiten („JavaScript-Zeichen“, 16 Bit) zurückgibt. (Weitere Informationen zu Unicode finden Sie im Kapitel „Kapitel 24. Unicode und JavaScript“ in „Speaking JavaScript“.) Zum Beispiel:
Sie können nicht über Indizes auf die Elemente einer Menge zugreifen, sondern über einen Iterator. Daher funktioniert die Array-Destrukturierung für Mengen:
Der Iterator Set
gibt Elemente immer in der Reihenfolge zurück, in der sie eingefügt wurden, weshalb das Ergebnis der vorherigen Destrukturierung immer dasselbe ist.
10.4.2.1 Fehler bei der Selbstzerstörung eines Werts #
Ein Wert ist iterierbar, wenn er eine Methode hat, deren Schlüssel Symbol.iterator
ist, die ein Objekt zurückgibt. Array-Destrukturierung wirft a TypeError
wenn der zu destrukturierende Wert nicht iterierbar ist:
Das TypeError
wird bereits vor dem Zugriff auf Elemente des iterable , was bedeutet, dass Sie das leere Array-Muster verwenden können, um zu überprüfen, ob ein Wert iterable:
10.5 Standardwerte #
Standardwerte sind eine optionale Funktion von Mustern. Sie bieten einen Fallback, wenn in der Quelle nichts gefunden wird. Wenn ein Teil (eine Objekteigenschaft oder ein Array-Element) in der Quelle keine Übereinstimmung aufweist, wird er mit:
- sein Standardwert (falls angegeben; es ist optional)
-
undefined
( ansonsten)
Schauen wir uns ein Beispiel an. In der folgenden Destrukturierung hat das Element am Index 0 auf der rechten Seite keine Übereinstimmung. Daher wird die Destrukturierung fortgesetzt, indem x
mit 3 abgeglichen wird, was dazu führt, dass x
auf 3 gesetzt wird.
Sie können auch Standardwerte in Objektmustern verwenden:
10.5.1 undefined
trigger Standardwerte #
Standardwerte werden auch verwendet, wenn ein Teil eine Übereinstimmung hat und diese Übereinstimmung undefined
ist:
Die Gründe für dieses Verhalten werden im nächsten Kapitel im Abschnitt Parameterstandardwerte erläutert.
10.5.2 Standardwerte werden bei Bedarf berechnet #
Die Standardwerte selbst werden nur berechnet, wenn sie benötigt werden. Mit anderen Worten, diese Destrukturierung:
ist äquivalent zu:
Sie können beobachten, dass, wenn Sie verwenden console.log()
:
In the second destructuring, the default value is not triggered and log()
is not called.
10.5.3 Default values can refer to other variables in the pattern #
A default value can refer to any variable, including other variables in the same pattern:
Ordnung ist jedoch wichtig: die Variablen x
und y
werden von links nach rechts deklariert und erzeugen ein ReferenceError
, wenn auf sie vor ihren Deklarationen zugegriffen wird:
10.5.4 Standardwerte für Muster #
Bisher haben wir nur Standardwerte für Variablen gesehen, aber Sie können sie auch mit Mustern verknüpfen:
Was bedeutet das? Rufen Sie die Regel für Standardwerte auf: Wenn ein Teil in der Quelle keine Übereinstimmung aufweist, wird die Destrukturierung mit dem Standardwert fortgesetzt.
Das Element am Index 0 hat keine Übereinstimmung, weshalb die Destrukturierung mit fortgesetzt wird:
Sie können leichter erkennen, warum die Dinge so funktionieren, wenn Sie das Muster { prop: x }
durch die Variable ersetzen pattern
:
10.5.5 Komplexere Standardwerte #
Lassen Sie uns die Standardwerte für Muster weiter untersuchen. Im folgenden Beispiel weisen wir x
einen Wert über den Standardwert { prop: 123 }
zu:
Da das Array-Element am Index 0 auf der rechten Seite keine Übereinstimmung aufweist, wird die Destrukturierung wie folgt fortgesetzt und x
auf 123 gesetzt.
x
wird auf diese Weise jedoch kein Wert zugewiesen, wenn die rechte Seite ein Element am Index 0 hat, da dann der Standardwert nicht ausgelöst wird.
In diesem Fall wird die Destrukturierung fortgesetzt mit:
Wenn also x
123 sein soll, wenn entweder das Objekt oder die Eigenschaft fehlt, müssen Sie einen Standardwert für x
selbst angeben:
Dabei wird die Destrukturierung wie folgt fortgesetzt, unabhängig davon, ob die rechte Seite oder
ist.
10.6 Weitere Funktionen zur Objektdestrukturierung #
10.6.1 Eigenschaftswert-Shorthands #
Eigenschaftswert-Shorthands sind eine Funktion von Objektliteralen: Wenn der Eigenschaftswert eine Variable ist, die denselben Namen wie der Eigenschaftsschlüssel hat, können Sie den Schlüssel weglassen. Dies funktioniert auch für die Destrukturierung:
Sie können Eigenschaftswertkürzel auch mit Standardwerten kombinieren:
10.6.2 Berechnete Eigenschaftsschlüssel #
Berechnete Eigenschaftsschlüssel sind ein weiteres Objektliteral-Feature, das auch für die Destrukturierung geeignet ist. Sie können den Schlüssel einer Eigenschaft über einen Ausdruck angeben, wenn Sie ihn in eckige Klammern setzen:
Mit berechneten Eigenschaftsschlüsseln können Sie Eigenschaften zerstören, deren Schlüssel Symbole sind:
10.7 Weitere Funktionen zur Array-Destrukturierung #
10.7.1 Elision #
Mit Elision können Sie die Syntax von Array- „Löchern“ verwenden, um Elemente während der Destrukturierung zu überspringen:
10.7.2 Rest-Operator (...
) #
Mit dem Rest-Operator können Sie die verbleibenden Elemente eines Iterable in ein Array extrahieren. Wenn dieser Operator in einem Array-Muster verwendet wird, muss er als letzter kommen:
Wenn der Operator keine Elemente finden kann, vergleicht er seinen Operanden mit dem leeren Array. Das heißt, es erzeugt niemals undefined
oder null
. Zum Beispiel:
Der Operand des Rest-Operators muss keine Variable sein, Sie können auch Muster verwenden:
Der Rest-Operator löst die folgende Destrukturierung aus:
10.8 Sie können mehr als nur Variablen zuweisen #
Wenn Sie über Destrukturierung zuweisen, kann jedes Zuweisungsziel alles sein, was auf der linken Seite einer normalen Zuweisung zulässig ist.
Zum Beispiel ein Verweis auf eine Eigenschaft (obj.prop
):
Oder ein Verweis auf ein Array-Element (arr
):
Sie können Objekteigenschaften und Array-Elementen auch über den Rest-Operator zuweisen (...
):
Wenn Sie Variablen deklarieren oder Parameter über Destrukturierung definieren, müssen Sie einfache Bezeichner verwenden.
10.9 Fallstricke der Destrukturierung #
Bei der Verwendung der Destrukturierung sind zwei Dinge zu beachten:
- Sie können eine Anweisung nicht mit einer geschweiften Klammer beginnen.
- Während der Destrukturierung können Sie entweder Variablen deklarieren oder ihnen zuweisen, aber nicht beides.
Die nächsten beiden Abschnitte enthalten die Details.
10.9.1 Beginnen Sie eine Anweisung nicht mit einer geschweiften Klammer #
Da Codeblöcke mit einer geschweiften Klammer beginnen, dürfen Anweisungen nicht mit einer beginnen. Dies ist bedauerlich, wenn die Objektdestrukturierung in einer Zuweisung verwendet wird:
Die Problemumgehung besteht darin, den vollständigen Ausdruck in Klammern zu setzen:
Die folgende Syntax funktioniert nicht:
Mit let
, var
und const
verursachen geschweifte Klammern niemals Probleme:
10.10 Beispiele für Destrukturierung #
Beginnen wir mit ein paar kleineren Beispielen.
Die for-of
-Schleife unterstützt die Destrukturierung:
Sie können die Destrukturierung verwenden, um Werte auszutauschen. Das ist etwas, das Engines optimieren könnten, so dass kein Array erstellt würde.
Sie können die Destrukturierung verwenden, um ein Array aufzuteilen:
10.10.1 #
Einige integrierte JavaScript-Operationen geben Arrays zurück. Destrukturierung hilft bei der Verarbeitung:
Wenn Sie nur an den Gruppen interessiert sind (und nicht an der vollständigen Übereinstimmung all
), können Sie mit elision das Array-Element am index überspringen 0:
exec()
gibt null
zurück, wenn der reguläre Ausdruck nicht übereinstimmt. Leider können Sie null
nicht über Standardwerte verarbeiten, weshalb Sie in diesem Fall den Operator Or (||
) verwenden müssen:
Array.prototype.split()
gibt ein Array zurück. Daher ist die Destrukturierung nützlich, wenn Sie an den Elementen und nicht am Array interessiert sind:
10.10.2 #
Die Destrukturierung ist auch nützlich, um Daten aus Objekten zu extrahieren, die von Funktionen oder Methoden zurückgegeben werden. Beispielsweise gibt die Iteratormethode next()
ein Objekt mit zwei Eigenschaften zurück, done
und value
. Der folgende Code protokolliert alle Elemente des Arrays arr
über den Iterator iter
. Destrukturierung wird in Zeile A verwendet.
10.10.3 Array-Destrukturierung iterierbare Werte #
Array-Destrukturierung funktioniert mit jedem iterierbaren Wert. Das ist gelegentlich nützlich:
10.10.4 Mehrere Rückgabewerte #
Um die Nützlichkeit mehrerer Rückgabewerte zu ermitteln, implementieren wir eine Funktion findElement(a, p)
, die nach dem ersten Element im Array a
sucht, für das die Funktion p
true
zurückgibt. Die Frage ist: Was soll findElement()
zurückgeben? Manchmal interessiert man sich für das Element selbst, manchmal für seinen Index, manchmal für beides. Die folgende Implementierung gibt beide zurück.
Die Funktion iteriert über alle Elemente von array
über die Array-Methode entries()
, die ein iterierbares über Paare (Zeile A) zurückgibt. Auf die Teile der Paare wird über Destrukturierung zugegriffen.
Verwenden wir findElement()
:
Mehrere ECMAScript 6-Funktionen ermöglichten es uns, prägnanteren Code zu schreiben: Der Rückruf ist eine Pfeilfunktion; Der Rückgabewert wird über ein Objektmuster mit Eigenschaftswertkürzeln destrukturiert.
Da index
und element
sich auch auf Eigenschaftsschlüssel beziehen, spielt die Reihenfolge, in der wir sie erwähnen, keine Rolle. Wir können sie tauschen und nichts ändert sich:
Wir haben den Fall, dass sowohl Index als auch Element benötigt werden, erfolgreich behandelt. Was ist, wenn wir nur an einem von ihnen interessiert sind? Es stellt sich heraus, dass unsere Implementierung dank ECMAScript 6 auch dafür sorgen kann. Und der syntaktische Overhead im Vergleich zu Funktionen mit einzelnen Rückgabewerten ist minimal.
Jedes Mal extrahieren wir nur den Wert der einen Eigenschaft, die wir benötigen.
10.11 Der Destrukturierungsalgorithmus #
In diesem Abschnitt wird die Destrukturierung aus einem anderen Blickwinkel betrachtet: als rekursiver Mustervergleichsalgorithmus.
Am Ende werde ich den Algorithmus verwenden, um den Unterschied zwischen den folgenden beiden Funktionsdeklarationen zu erklären.
10.11.1 Der Algorithmus #
Eine Destrukturierungszuweisung sieht folgendermaßen aus:
Wir möchten pattern
verwenden, um Daten aus value
zu extrahieren. Dazu beschreibe ich nun einen Algorithmus, der in der funktionalen Programmierung als Pattern Matching (kurz: Matching) bekannt ist. Der Algorithmus gibt den Operator ←
(„match against“) für die Destrukturierungszuweisung an, der a pattern
mit a value
vergleicht und dabei Variablen zuweist:
Der Algorithmus wird über rekursive Regeln spezifiziert, die beide Operanden des Operators ←
auseinandernehmen. Die deklarative Notation mag gewöhnungsbedürftig sein, macht aber die Spezifikation des Algorithmus prägnanter. Jede Regel besteht aus zwei Teilen:
- Der Kopf (erste Zeile) beschreibt die Bedingung, die die Regel auslöst.
- Der Hauptteil (verbleibende Zeilen) beschreibt, was passiert, wenn die Regel ausgelöst wird.
Schauen wir uns ein Beispiel an:
- ( 2c)
{key: "pattern", "properties"} ← obj
- ( 2e)
{} ← obj
(keine Eigenschaften mehr vorhanden)
In Regel (2c) bedeutet der Kopf, dass diese Regel ausgeführt wird, wenn ein Objektmuster mit mindestens einer Eigenschaft und null oder mehr verbleibenden Eigenschaften vorhanden ist. Dieses Muster wird mit einem Wert obj
abgeglichen. Diese Regel bewirkt, dass die Ausführung fortgesetzt wird, wobei das Eigenschaftswertmuster mit obj.key
und die verbleibenden Eigenschaften mit obj
abgeglichen werden.
In Regel (2e)bedeutet der Kopf, dass diese Regel ausgeführt wird, wenn das leere Objektmuster {}
mit einem Wert obj
abgeglichen wird. Dann gibt es nichts zu tun.
Wenn der Algorithmus aufgerufen wird, werden die Regeln von oben nach unten überprüft und nur die erste Regel ausgeführt, die anwendbar ist.
Ich zeige nur den Algorithmus für die Destrukturierungszuweisung. Destrukturierende Variablendeklarationen und destrukturierende Parameterdefinitionen funktionieren ähnlich.
Ich behandle keine erweiterten Funktionen (berechnete Eigenschaftsschlüssel; Eigenschaftswertkürzel; b. Objekteigenschaften und Array-Elemente als Zuweisungsziele). Nur die Grundlagen.
10.11.1.1 Muster #
Ein Muster ist entweder:
- Eine Variable:
x
- Ein Objektmuster:
{"properties"}
- Ein Array-Muster:
Jeder der folgenden Abschnitte beschreibt einen dieser drei Fälle.
Die folgenden drei Abschnitte geben an, wie diese drei Fälle behandelt werden. Jeder Abschnitt enthält eine oder mehrere nummerierte Regeln.
10.11.1.2 Variabel #
- (1)
x ← value
( einschließlichundefined
undnull
)
10.11.1.3 Objekt muster #
- ( 2a)
{"properties"} ← undefined
- ( 2b)
{"properties"} ← null
- ( 2c)
{key: "pattern", "properties"} ← obj
- ( 2d)
{key: "pattern" = default_value, "properties"} ← obj
- ( 2e)
{} ← obj
(keine Eigenschaften mehr vorhanden)
10.11.1.4 Array-Muster #
Array-Muster und iterierbar. Der Algorithmus für die Array-Destrukturierung beginnt mit einem Array-Muster und einem iterierbaren:
- ( 3a)
← non_iterable
assert(!isIterable(non_iterable))
- ( 3b)
← iterable
assert(isIterable(iterable))
Helfer funktion:
Array-Elemente und Iterator. Der Algorithmus fährt mit den Elementen des Musters (linke Seite des Pfeils) und dem Iterator fort, der aus dem Iterierbaren (rechte Seite des Pfeils) erhalten wurde.
- ( 3c)
"pattern", "elements" ← iterator
- ( 3d)
"pattern" = default_value, "elements" ← iterator
- ( 3e)
, "elements" ← iterator
(loch, Elision)
- ( 3f)
..."pattern" ← iterator
(immer letzter Teil!)
- ( 3g)
← iterator
(keine Elemente mehr vorhanden)
Helfer funktion:
10.11.2 Wenn Sie den Algorithmus #
In ECMAScript 6 anwenden, können Sie benannte Parameter simulieren, wenn der Aufrufer ein Objektliteral verwendet und der Angerufene die Destrukturierung verwendet. Diese Simulation wird im Kapitel Parameterhandhabung ausführlich erläutert. Der folgende Code zeigt ein Beispiel: Die Funktion move1()
hat zwei benannte Parameter, x
und y
:
In Zeile A gibt es drei Standardwerte:
- Mit den ersten beiden Standardwerten können Sie
x
undy
weglassen. - Mit dem dritten Standardwert können Sie
move1()
ohne Parameter aufrufen (wie in der letzten Zeile).
Aber warum würden Sie die Parameter wie im vorherigen Codeausschnitt definieren? Warum nicht wie folgt – das ist auch völlig legal ES6-Code?
Um zu sehen, warum move1()
korrekt ist, verwenden wir beide Funktionen für zwei Beispiele. Bevor wir das tun, wollen wir sehen, wie die Übergabe von Parametern über Matching erklärt werden kann.
10.11.2.1 Hintergrund: Übergeben von Parametern über matching #
Bei Funktionsaufrufen werden formale Parameter (innerhalb von Funktionsdefinitionen) mit tatsächlichen Parametern (innerhalb von Funktionsaufrufen) abgeglichen. Nehmen Sie als Beispiel die folgende Funktionsdefinition und den folgenden Funktionsaufruf.
Die Parameter a
und b
werden ähnlich wie bei der folgenden Destrukturierung eingerichtet.
10.11.2.2 Verwenden move2()
#
Lassen Sie uns untersuchen, wie die Destrukturierung für move2()
funktioniert.
Beispiel 1. move2()
führt zu dieser Destrukturierung:
Das einzelne Array-Element auf der linken Seite hat keine Übereinstimmung auf der rechten Seite, weshalb {x,y}
mit dem Standardwert und nicht mit Daten von der rechten Seite abgeglichen wird (Regeln 3b, 3d):
Die linke Seite enthält Eigenschaftswertkürzel, es ist eine Abkürzung für:
Diese Destrukturierung führt zu den folgenden zwei Zuweisungen (Regeln 2c, 1):
Beispiel 2. Untersuchen wir den Funktionsaufruf move2({z:3})
, der zur folgenden Destrukturierung führt:
Auf der rechten Seite befindet sich ein Array-Element am Index 0. Daher wird der Standardwert ignoriert und der nächste Schritt ist (Regel 3d):
Das führt dazu, dass sowohl x
als auch y
auf undefined
gesetzt werden, was nicht das ist, was wir wollen.
10.11.2.3 Verwenden move1()
#
Versuchen wir move1()
.
Beispiel 1: move1()
Wir haben kein Array-Element am Index 0 auf der rechten Seite und verwenden den Standardwert (Regel 3d):
Die linke Seite enthält Eigenschaftswertkürzel, was bedeutet, dass diese Destrukturierung äquivalent ist zu:
Weder Eigenschaft x
noch Eigenschaft y
haben eine Übereinstimmung auf der rechten Seite. Daher werden die Standardwerte verwendet und die folgenden Destrukturen werden als nächstes ausgeführt (Regel 2d):
Das führt zu folgenden Zuweisungen (Regel 1):
Beispiel 2: move1({z:3})
Das erste Element des Array-Musters hat eine Übereinstimmung auf der rechten Seite und diese Übereinstimmung wird verwendet, um die Destrukturierung fortzusetzen (Regel 3d):
Wie in Beispiel 1 gibt es auf der rechten Seite keine Eigenschaften x
und y
und es werden die Standardwerte verwendet:
10.11.2.4 Fazit #
Die Beispiele zeigen, dass Standardwerte ein Merkmal von Musterteilen (Objekteigenschaften oder Array-Elementen) sind. Wenn ein Teil keine Übereinstimmung hat oder mit undefined
übereinstimmt, wird der Standardwert verwendet. Das heißt, das Muster wird stattdessen mit dem Standardwert abgeglichen.