一道考察连续赋值的面试题
下面代码的输出结果是什么?
var a = {n: 1}; // a保持对{n:1}对象的引用
var b = a; // b保持对{n:1}对象的引用
a.x = a = {n: 2}; // a的引用被改变
a.x // --> undefined
b.x // --> {n: 2}
a首先获得对{n:1}的引用,接着a赋值给b,a和b此时指向同一个位置;a.x = a = {n: 2};连续赋值:
- 首先考虑
.运算符优先,a和b此时都保持着{n: 1}的引用,b也保持对原来位置的{n: 1}的引用,于是a.x使得原来位置的对象增加一个x属性:{n: 1}=>{n: 1, x: undefined}, 此时a和b还是对原来对象的引用,只不过原来对象增加了x属性 - 接着
=从右往左运算,a = {n: 2},把a的引用变成了{n: 2}这个对象,a指向的位置改变了,但b还是指向原来的位置 - 最后,
a.x=a,此时a.x是最开始解析的时候对原来位置{ n: 1, x: undefined}中的x引用,也就相当于是现在的b.x,于是{ n: 1, x: undefined}=>{n: 1, x: { n: 2}},即b.x = { n: 2 }
- 最后
a和b指向不同的位置,a指向{n: 2}而b指向{n: 1, x: { n: 2}}