2016-09-25 20 views
0

基本上,代码行curr = curr[ch] = curr[ch] || {}将变量ch设置为对象的键并将{}设置为对象的值,然后指向其子引用。JavaScript在JavaScript中如何连续工作?

但有人可以详细解释它是如何工作的?由于

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); 

它会显示结果:

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

赋值运算符是正确关联的,'||'具有[更高优先级](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table),所以重写这样的行:'curr =(curr [ch] =(curr [ch] || {}));'并且应该清楚。 – 2016-09-25 18:01:59

回答

1

让我们通过做散步。我加了括号使事情更清楚 - 他们不改变意思。

let root = {}; 
let curr = root; 

不在话下直到现在

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

好了,curr[ch]undefined的时刻,因为有一个在curr没有财产a(目前ch的价值),它指向同一个对象root。因此最内部的括号评估为{}

该值分配为curr[ch]。所以很显然,root对象现在有一个属性a

最后,此对象(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] || {})); 

是的,现在应该清楚了。

非常紧凑但不是很清晰的代码。

+0

非常感谢你的时间!非常明确的解释! –