题目如下:
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x)
console.log(b.x)
答案是:
undefined
{n:2}
解析:
首先:a
和b
同时引用了{n:2}
对象
然后执行a.x = a = {n: 2}
语句,尽管赋值是从右到左的
但.
的优先级比=
高,所以这里会先执行a.x
,相当于为a
所指向的对象{n:1
}新增了一个属性x
然后执行a={n:2}
,相当于改变了a
的指向,a
不再指向对象{n:1}
,而是指向新对象{n:2}
而此时b的对象指向时没有改变的,还是指向{n:1}
之后执行a.x={n:2}
,这里并不会重新解析一遍a
,也就是会继续沿用最初解析a.x
时的a
,也就是指向{n:1}
的a
因此,旧对象中的x
的属性值指向新对象{n:2}
,此时整个旧对象为{n:1,x:{n:2}}
,而整个旧对象它只是被b
引用着
所以后面输出a.x
时,又要解析a
,而此时a
是指向新对象{n:2}
的,而这个新对象里没有x
属性,所以访问时输出undefined
而访问b.x
时,将会输出旧对象的x
值,也就是说{n:2}