2015-09-03 4 views
8

So grundlegende desctucting ist in Ordnung, {a, b} = obj transpiles zu a = obj.a; b = obj.b.Ist Babel's Implementierung der ES6-Objektdestrukturierung korrekt?

Meine Frage ist, um ein bisschen aus einer ungeraden Syntax, die ich über versehentlich lief und ich frage mich, wenn mir jemand bei spec zeigen kann, da ich es nicht finden kann:

({a, b} = obj).c 

, dass die beiden tut a, b Zuweisungen und dann zurück obj.c. Es ist eigentlich ganz nützlich für mich für einen Byte-Stream-Decoder, wie ich schreiben kann:

let width = ({bytes} = intDecode(bytes)).number; 

Mein Problem ist, dass ich diese Syntax nicht überall gesehen haben und will nicht auf etwas verlassen, die entweder falsch implementiert oder in der Angebotsphase.

+0

Es ist das gleiche wie '(obj = IntDecode (Bytes)). Anzahl; bytes = obj.bytes' (möglicherweise mit Ausnahme der Bewertungsreihenfolge) - dieselbe ungerade Syntax in ES5. Stellen Sie jedoch sicher, dass 'Bytes' irgendwo angegeben ist. – Bergi

Antwort

3

Es gibt nichts besonderes in Destrukturierung Zuweisung: es ist wie jede andere Zuweisung mit = Operator ausgewertet.

So gibt es rval zurück.

Das bedeutet, Sie können auf Ihre Syntax verlassen.

Einige Details:

Die Destrukturierung Teil in der [1]6ausgewertet:

status das Ergebnis der Durchführung DestructuringAssignmentEvaluation von assignmentPatternrval als Argument verwendet Let sein.

und nach diesem Punkt passiert die Zuordnung Bewertung wie in der Regel, wie in der a = b = 42; Fall.

Referenzen:

+0

Es ist strittig, was der 'rval' tatsächlich hier ist. 12.4.4 (1.a) - 'Lass rref das Ergebnis der Evaluierung von AssignmentExpression sein. - Ich würde argumentieren, dass in' ({a} = obj) ',' rval === obj.a', _nicht_' obj' –

+0

@zyklus es ist nicht, "rval" ist der Wert des rechten Operanden des Operators '='. '4. Let rval sei GetValue (rref). " – zerkms

+1

In' ({a} = obj) 'Ausdruck' rval' ist das 'obj', gemäß Spezifikation. 'obj.a' wird während der Destrukturierungszuweisungsauswertung nachgeschlagen, bei der 'obj' als Parameter übergeben wurde. – zerkms

1

Ja, wird erwartet, wie dies funktioniert (@zerkms' Antwort für Details). Dass Sie die Syntax nirgendwo gesehen haben, liegt daran, dass es nicht gerade praktisch ist, auf Eigenschaften des Ergebnisses eines Zuweisungsausdrucks zuzugreifen, da der Code dadurch ziemlich unlesbar wird. Ob Sie einer normalen Variablen oder einem destrukturierenden Ausdruck zuordnen, macht hier keinen großen Unterschied.

aber man kann ganz einfach den Code in eine vernünftige Destrukturierung Zuordnung verwandeln:

let {bytes, number:width} = intDecode(bytes); 

oder tatsächlich, genauer zu Ihrem ursprünglichen Code:

let width; 
({bytes, number:width} = intDecode(bytes)); 
+0

@Felix Kling: sind diese Klammern, nur um mehr wie OP ursprünglichen Code oder etwas anderes aussehen? – zerkms

+2

@zerkms: '{...} = foo' ist ein Syntaxfehler, weil die' {} 'als Block interpretiert werden. Klammern müssen durchgesetzt werden, damit sie als Muster analysiert werden. –

+0

Oh richtig ....... – zerkms

Verwandte Themen