2016-07-29 3 views
0

Ich habe in ES6 etwas Destrukturierung durchgeführt und bin in eine unerwartete Situation geraten. Hier ist eine trivialisierte Version von dem, was passiert ist.Unerwartetes Destrukturierungsverhalten, zweimaliges Deklinieren eines Schlüssels beim Destrukturieren

let obj = {x: {y: 5}}; 
let {x: {y}} = obj; 

console.log(x); // x is not defined 
console.log(y); // 5 

In meinem Anwendungsfall, brauchte ich Zugang sowohl zu x und y. Ich hätte erwartet, dass auch x destrukturiert wurde. Stattdessen die gewünschte Wirkung zu bekommen, musste ich dies tun:

let obj = {x: {y: 5}}; 
let {x, x: {y}} = obj; 

console.log(x); // {"y":5} 
console.log(y); // 5 

Aber ich denke, {x, x: {y}} seltsam und nicht intuitiv aussieht. Gibt es ein Destrukturierungsgeheimnis, das mir nicht bekannt ist, oder ist das nur eine winzige Störung der Destrukturierung?

+0

Wie zur Intuitivität Ihrer Erwartungen, wie würden Sie erwarten, dass sich const {x: {x}} = {x: {x: 5}} 'verhält? Sollte es das erste "x" zerstören und dann "x" dem zweiten "x" neu zuweisen? Aber 'x' ist eine Konstante und kann nicht neu zugewiesen werden. Sollte es "x wurde schon deklariert" werden? – estus

Antwort

0

Es ist keine Fallstricke, aber das erwartete Verhalten, etwas, das durch destructuring syntax definiert ist.

Möglicherweise ist AssignmentPropertyList in ObjectAssignmentPattern und verschachtelt AssignmentPropertyList in AssignmentPropertyList. Jede AssignmentPropertyList kann entweder AssignmentProperty oder PropertyName : AssignmentElement sein.

In diesem Fall

let {x, x: {y}} = obj; 

der erste xAssignmentProperty ist, ist der zweite xPropertyName.

Die Idee hinter verschachtelter Destrukturierung besteht darin, einen Pfad für verschachtelte Eigenschaften bereitzustellen, die destrukturiert werden. Das erwartete Verhalten ist nicht erhalten unerwünschte Variablen für jede Ebene der verschachtelten Destrukturierung, Zwischen x sollte bei Bedarf explizit destrukturiert werden.

Es sollte nichts seltsam oder nicht intuitiv in dieser Syntax für den Entwickler sein, der damit vertraut ist. Die Variation, die näher an ist, was der Code tut (und möglicherweise besser lesbar) ist

let {x} = obj; 
let {y} = x; 
+0

Danke, dass du mich auf dem Weg beleidigt hast! – DynamiteReed

+0

@ BlueJ774 Ich hatte keine Beleidigung. Aber froh, dass ich irgendwie helfen konnte. – estus

+0

"Es sollte nichts seltsam oder nicht intuitiv in dieser Syntax für den Entwickler sein, der damit vertraut ist." Ich sage nur, das hat mich und einen zweiten Entwickler überrascht. Wir schreiben seit zwei Jahren Enterprise ES6-Code. – DynamiteReed

1

Dieses:

let {x: {y}} = obj; 

ist eine Abkürzung für:

let {x: {y: y}} = obj; 

Destrukturierung passt die Doppelpunkte linke Seiten (die Schlüssel) gegen die Daten und setzt die Ergebnisse in die rechten Seiten (Zuweisungsziele, in der Regel Variablen). Daher ist x hier nur ein Schlüssel, während y sowohl ein Schlüssel als auch eine neu deklarierte Variable ist.

+0

Danke, @AxelRauschmayer, schön, eine Antwort von dir hier zu haben. Klingt nach einfacher, aber verständlicher Erklärung für mich. – estus

Verwandte Themen