2016-07-29 4 views
0

私はES6でいくつかの破壊を行い、予期しない状況に遭遇しました。ここには何が起こったのtrivializedバージョンです。私の使用例で予期せぬ破棄の振る舞い、より深く破壊するときにキーを2回宣言しなければならない

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

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

、私はxyの両方へのアクセスを必要としていました。私はxも破壊されていると予想していたでしょう。代わりに、所望の効果を得るために、私はこれをしなければならなかった:

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

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

は、しかし、私は{x, x: {y}}は奇妙かつ直感的に見えると思います。私が気付いていない破壊的な秘密があるか、これはちょっとした破壊的な落とし穴ですか?

+0

期待通りの直感性については、const {x:{x}} = {x:{x:5}} 'はどのように動作すると思いますか?それは最初の 'x'を分解し、' x'を2番目の 'x'に再割り当てすべきでしょうか?しかし、「x」は定数であり、再割り当てすることはできません。 'xは既に宣言されていますか?' – estus

答えて

0

これは落とし穴ではなく、予想される動作です。destructuring syntaxによって定義されています。

ObjectAssignmentPatternにはAssignmentPropertyListがあり、AssignmentPropertyListにはAssignmentPropertyListがネストされている場合があります。それぞれAssignmentPropertyListAssignmentPropertyまたはPropertyName : AssignmentElementのいずれかです。この場合

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

xは、第xPropertyNameで、AssignmentPropertyあります。

ネストされた構造解除の背後にあるアイデアは、構造が破壊されるネストされたプロパティのパスを提供することです。期待される振る舞いはではないネストされた構造解除の各レベルで望ましくない変数を取得する場合は、中間のxを必要に応じて明示的に破棄する必要があります。

これに精通している開発者にとっては、この構文では奇妙なものや直感的なものはありません。

let {x: {y}} = obj; 

がの省略形である:

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

な破壊はコロンと一致するコードが何に近い(そしておそらくより読みやすい)でばらつきが

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

途中で私を侮辱してくれてありがとう! – DynamiteReed

+0

@ BlueJ774私は侮辱を心配していませんでした。しかし、私は何とか助けてくれてうれしいです。 – estus

+0

"これに精通している開発者にとっては、この構文には奇妙でも直感でもないはずはありません。私はちょうど、これは私と2番目の開発者を驚かせた。我々は、エンタープライズES6のコードを2年間書きました。 – DynamiteReed

1

これです(キー)をデータと照らし合わせ、結果を右側(代入対象、通常は変数)に配置します。したがって、xはキーに過ぎず、yはキーと新しく宣言された変数です。

+0

ありがとうございます、@AxelRauschmayer、ここから答えを得てうれしいです。シンプルで分かりやすい説明のようなものです。 – estus

関連する問題