2016-09-25 1 views
0

基本的に、コードcurr = curr[ch] = curr[ch] || {}の行は、変数chをオブジェクトのキーとして設定し、オブジェクトの値として{}を設定し、その子参照をポイントします。JavaScriptの2つの連続した等号はどのように機能しますか?

しかし、どのように詳細に説明できますか?

{ 
    a: { 
    b: { 
     c: {} 
    } 
    } 
} 
+1

代入演算子は右結合で、 '||'は[より高い優先順位](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)です。 'curr =(curr [ch] =(curr [ch] || {)))}'のように改行してください。 –

答えて

1

さんが散歩をしてみましょう:ありがとう

http://jsbin.com/gokapoc/1/edit?js,console

let root = {}; 
let curr = root; 

let ch = 'a'; 
curr = curr[ch] = curr[ch] || {}; 
ch = 'b'; 
curr = curr[ch] = curr[ch] || {}; 
ch = 'c'; 
curr = curr[ch] = curr[ch] || {}; 

console.log(root); 

それは結果が表示されます。私は物事をより明確にするために括弧を付けました - 彼らは意味を変えません。

let root = {}; 
let curr = root; 

同じオブジェクトを指すcurrで今

let ch = 'a'; 
curr = (curr[ch] = (curr[ch] || {})); 

さてまで困難なし、全く性a(現時点でchの値)がないので、そうcurr[ch]は、現時点でundefinedありますroot。したがって、最も内側のかっこは{}と評価されます。

この値はcurr[ch]に割り当てられます。だから明らかに今はrootオブジェクトにaのプロパティがあります。

最後に、このオブジェクト()はcurrに割り当てられます。外側の括弧内の代入が割り当てられた値を返します。これはプロパティaのオブジェクトです。

ch = 'b'; 
curr = (curr[ch] = (curr[ch] || {})); 

currがここrootではないことに注意してくださいしかしroot.aポイントに同じオブジェクトをただ重要なのは、前と基本的に同じ。最後にcurrroot.a.bと同じオブジェクトを指します。

ch = 'c'; 
curr = (curr[ch] = (curr[ch] || {})); 

これは明らかです。

非常にコンパクトですが、あまり明確なコードではありません。

+0

ありがとうございました!非常に明確な説明! –

関連する問題