var a = {n : 1};
var b = a;
a.x =a = {n : 2};
console.log(a.x); // undefined
console.log(b.x); // { n:2 }
解析
JS引用类型指针的工作方式
首先是a指向了一个对象{n:1},b指向了a所指向的对象
然后 a.x = a = { n:2 }
js赋值运算顺序为从右往左,不过由于"."运算符优先级最高,所以先计算a.x。此时a指向的对象{n:1 }新增了新的属性x,这个x的值为undefined。
接着执行赋值预算 a={n:2},这个时候a指向的对象就发生了变化,指向了新的对象 {n:2}。
继续执行 a.x = a。此时啊a.x已经指向了对象{n:1,x=undefined}中的x,等待被赋值,那么这个对象就变成了{n:1,x:{n:2}},也就是b所指向的对象。
本质在于 .运算优先于=赋值运算
如果还是理解不了,可以看图
其实这种题也只能拿来做考题,正常也不会有人这么写代码,写出来怕自己也理解不了。更多的写法是分开写会好一些。
譬如:
var a={n:1};
var b={n:2};
var c=a;
var d;
b.x=d=a.x=a={n:3}
//等价于
a.x={n:3};
b.x={n:3};
a={n:3};
d={n:3}
//结果是
a : {n:3}
b : {n:2,x:{n:3}}
c : {n:1,x:{n:3}}
d : {n:3}