下面是一个连续赋值的例子:
在这里面,先创建 a 对象并添加 n:1,然后将 a 对象赋值给 b,这时候 a 和 b 引用同一个对象。最后我们要着重理解这最后一行代码
- a.x = a = {
- n: 2
- };
按照我们平常的思维,应该是 {n:2} 赋值给 a,a 的引用改变了,但 b 仍然是原来的引用, 然后再赋值给 a.x,这时候 a 是{n:2,x:{n:2}},也即是 a.x={n:2}。但是,很显然我们的执行结果不是这样的,为什么会这样呢?
其实这是调皮的运算优先级搞的鬼,a.x 成员访问的优先级仅次于括号(),成员访问. 访问的属性如果不存在就会被创建并且该成员访问表达式的值是 undefined。这里的会先执行 a.x,此时为 a 动态的创建了 x 属性,属性值默认为 undefined,并且由于 b 引用和 a 同一个地址,所以也拥有 b.x 这个属性。然后开始赋值运算
,此时 a 的指向地址更改,注意这时候 a.x(b.x)仍然是原先地址的属性,更改变引用地址的 a 已经没有关系了。然后是
- a={n:2}
,所以
- a.x={n:2}
,并且由于 a 指向的是新地址,当执行 a.x 的时候,
- b.x={n:2}
。
- a.x=undefined
来源: http://www.bubuko.com/infodetail-1977751.html