2016-02-07 6 views
6

私は他の人のコードを見直していますが、ES2015は使い慣れていますが、私は分解を続けています。中括弧 '{}'の文脈を理解する

以前のJavascriptでは、ブロックまたはオブジェクトのいずれかにカーブブラケット{}が使用されていました。例えば引数コンテナが実際のオブジェクトまたは単にブロックであり、

let a = ({ a, b }) => { 
} 

私の質問:

// Curly Brackets Block 
If() { 
    ... 
} 

// Curly Brackets in Obj 
var obj = { 
    a : 1, 
    ... 
} 

しかし、非構造では、我々は再び、再び、次の構文を参照してください? 以下は、上記のコードと同じにするかどうかを説明してください:

let a = (a, b) => { 
} 

EDIT:(今のところ)DestruturingにアクセルRauschmayersの記事を読んでから私の理解では、我々は単に小道具をマッピングしているということです。常に新しいObjに挿入しますか? I.

let a = { first : a, second : b } = AnObj; 
=== 
a.a === AnObj.first; 
a.b === AnObj.second; 

上記は正しいですか? objは常にインスタンス化されていますか?しかし、それは上記の関数のように意味をなさないので、小道具のためにこのように作成されたオブジェクトは匿名オブジェクトでしょうか?

多くのおかげで、

+1

にdesugarでしょう、あなたにたくさんの[非構造](https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20&%20beyondを助けます/ch2.md#destructuring) – Vardius

+0

破壊の割り当てが処理されたときに何が起こっているかを実際に知りたい場合は、仕様を見てください:http://www.ecma-international.org/ecma-262/6.0/#sec -destructuring-assignment –

答えて

2

いいえ、中断の中括弧はブロックもオブジェクトリテラルも構成しません。

ステートメントではない(ステートメントリストが含まれていない)ため、間違いなくブロックではなく、のようにのようなオブジェクトリテラルです。実際には、オブジェクトリテラルと同じ構文を持つことさえありますが、唯一の違いは代入対象(代入演算子の左辺)または関数パラメータの位置にあることです。

let a = ({ a, b }) => {…}let a = (a, b) => {…}と同じですか?

いいえ、実際はありません。両方のパラメータリストは関数スコープに対してabという変数を宣言していますが、最初の関数はプロパティが.a.bのオブジェクトを期待しています。

私の理解では、プロパティを新しいobjにマッピングするだけです。

いいえ作成またはインスタンス化された新しいオブジェクトはありません。あなたが渡すオブジェクト(右手側)だけがあります。そしてそれはで、 - "引き離された" - さまざまなサブターゲット(変数、プロパティ参照)に割り当てられる部分に分解されます。

あなたは

({first: a.b, second: a.c}) = anObj; 

(括弧は、ブロックからの発現を区別する必要がある)使用したい分割代入と

a.b = anObj.first; 
a.c = anObj.second; 

を書き込みます。

しかし、より一般的な使用例は変数の初期化です。あなたは

let {first: b, second: c} = anObj; 

let b = anObj.first, 
    c = anObj.second; 

を短縮することができ、また、変数がプロパティとして同じ名前を持つ速記がありますので、

let first = anObj.first, 
    second = anObj.second; 

let {first, second} = anObj; 
に相当します

let a = { first : a, second : b } = anObj;は正しいですか?

いいえ、あまり意味がありません。それはこの1つを読ん

let a; 
a = anObj.first; 
b = anObj.second; 
a = anObj; 
+0

私の頭の中の混乱をクリア&私の頭の中括弧についての質問の全体のホストを作成する素晴らしい答え:)ありがとう@ベルギー – Kayote

0

これは、非構造のためである:

var obj = {a: 1, b: 2}, 
    add = ({a, b}) => a + b; 

console.log(add(obj)); //3 

だから基本的には関数内のステートメントには2つの引数があると思われるが、あなたはそれを呼び出すときにのみオブジェクトを渡します。

+0

答えのおかげで、しかし、それは/ sの質問に答えることはありません。私が文脈を理解しようとしていると、破壊中に実際に何が起こっているのか。 – Kayote

関連する問題