输出以下代码的执行结果并解释为什么
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x) console.log(b.x)
结果
undefined {n:2}
1:a
和b
同时引用了{n:1}
对象,接着执行到a.x = a = {n:2}
语句;
尽管赋值是从右到左的没错,但是.
的优先级比=
要高,所以这里首先执行a.x
,
相当于为a(或者b)
所指向的{n:1}
对象新增了一个属性x
,即此时对象将变为{n:1;x:undefined}
。
2:之后按正常情况,从右到左进行赋值,此时执行a ={n:2}
的时候,a
的引用改变,指向了新对象{n:2}
,而b
依然指向的是旧对象。之后执行a.x = {n:2}
的时候,并不会重新解析一遍a,而是沿用最初解析a.x
时候的a
,也即旧对象,故此时旧对象的x
的值为{n:2}
,旧对象为 {n:1;x:{n:2}}
,它被b
引用着。 后面输出a.x
的时候,又要解析a
了,此时的a
是指向新对象的a
,而这个新对象是没有x
属性的,故访问时输出undefined
;而访问b.x
的时候,将输出旧对象的x
的值,即{n:2}
。