基本的に、コードcurr = curr[ch] = curr[ch] || {}
の行は、変数ch
をオブジェクトのキーとして設定し、オブジェクトの値として{}
を設定し、その子参照をポイントします。JavaScriptの2つの連続した等号はどのように機能しますか?
しかし、どのように詳細に説明できますか?
{ a: { b: { c: {} } } }
基本的に、コードcurr = curr[ch] = curr[ch] || {}
の行は、変数ch
をオブジェクトのキーとして設定し、オブジェクトの値として{}
を設定し、その子参照をポイントします。JavaScriptの2つの連続した等号はどのように機能しますか?
しかし、どのように詳細に説明できますか?
{ a: { b: { c: {} } } }
さんが散歩をしてみましょう:ありがとう
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
ポイントに同じオブジェクトをただ重要なのは、前と基本的に同じ。最後にcurr
はroot.a.b
と同じオブジェクトを指します。
ch = 'c';
curr = (curr[ch] = (curr[ch] || {}));
これは明らかです。
非常にコンパクトですが、あまり明確なコードではありません。
ありがとうございました!非常に明確な説明! –
代入演算子は右結合で、 '||'は[より高い優先順位](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)です。 'curr =(curr [ch] =(curr [ch] || {)))}'のように改行してください。 –