基本上,代码行curr = curr[ch] = curr[ch] || {}
将变量ch
设置为对象的键,并将{}
设置为对象的值,然后指向其子引用。
但有人可以详细解释它是如何工作的吗?感谢
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: {} } } }
答案 0 :(得分:1)
让我们一起来看看。我添加了括号以使事情更清楚 - 它们不会改变含义。
let root = {};
let curr = root;
直到现在没什么难的
let ch = 'a';
curr = (curr[ch] = (curr[ch] || {}));
好的,curr[ch]
目前是undefined
,因为a
中的ch
没有属性curr
(root
的值)与{}
相同的对象。因此,最内部括号的计算结果为curr[ch]
。
此值已分配给a
。显然现在root
对象中有一个属性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] || {}));
相同的对象。
{{1}}
是的,现在应该清楚了。
代码非常紧凑但不是很清晰。