javascript - tutorial - Objektzerstörung ohne var




ecmascript javascript version (2)

Warum löst die Objektdestrukturierung einen Fehler aus, wenn kein var Schlüsselwort davor steht?

{a, b} = {a: 1, b: 2};

wirft SyntaxError: expected expression, got '='

Die folgenden drei Beispiele funktionieren problemlos

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];

Bonusfrage: Warum brauchen wir kein var für die Array-Destrukturierung?

Ich bin auf das Problem gestoßen, als ich so etwas gemacht habe

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

https://code.i-harness.com


Das Problem rührt von den {...} Operatoren her, die in JavaScript mehrere Bedeutungen haben.

Wenn am Anfang einer Anweisung { angezeigt wird, stellt dies immer einen block , dem keine Zuweisung möglich ist. Wenn es später in der Anweisung als Ausdruck angezeigt wird, repräsentiert es ein Objekt.

Die var hilft dabei, diese Unterscheidung zu treffen, da sie nicht von einer Anweisung gefolgt werden kann, ebenso wie die Gruppierung von Klammern :

( {a, b} = objectReturningFunction() );

In ihren Dokumenten: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration

Hinweise: Die Klammern (...) um die Zuweisungsanweisung sind erforderlich, wenn Sie eine Objekt-Literal-Destrukturierungszuweisung ohne Deklaration verwenden.

{a, b} = {a: 1, b: 2} ist keine gültige eigenständige Syntax, da {a, b} auf der linken Seite als Block und nicht als Objektliteral betrachtet wird.

({A, b} = {a: 1, b: 2}) ist jedoch gültig, ebenso wie var {a, b} = {a: 1, b: 2}.

Vor Ihrem (...) Ausdruck muss ein Semikolon stehen oder er kann verwendet werden, um eine Funktion in der vorherigen Zeile auszuführen.


Wenn Sie JavaScript ohne Semikolon schreiben , sollte der Syntax "Zuweisung ohne Deklaration" ein Semikolon vorangestellt werden, damit sie vorhersehbar funktioniert

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;

Ich wollte dies nur hervorheben, als es mich herausfing und hoffentlich anderen Zeit sparen kann, herauszufinden, warum es nicht funktioniert und / oder seltsame Ergebnisse mit Code-Formatierern usw. erzeugt.

Tatsächlich ist es in der akzeptierten Antwort (letzte Zeile der zitierten Dokumente) genau richtig, aber leicht zu übersehen, insbesondere ohne ein Beispiel zu sehen!





ecmascript-6