题目
输出是什么
var a = { n: 1 }
var b = a
a.x = a = { n: 2 }
console.log(a.n, b.n)
console.log(a.x, b.x)
考察点:
在浏览器中,对象属性的赋值操作会先于变量赋值操作执行
分析
- 首先创建了一个对象 a,其 n 属性值为 1。
- 变量 b 被赋值为对象 a 的引用。
- 执行
a.x = (a = { n: 2 })
时,会先将a
的属性x
赋值为undefined
,然后再将a
的值更新为{ n: 2 }
。此时变量 a 指向新的对象{ n: 2 }
,但 b 仍然指向旧的对象{ n: 1 ,x:{n:2}}
。
核心:
a.x = (a = { n: 2 })先将 a.x 赋值为 undefined,再从右向左执行代码。
输出结果:
2 1
undefined { n: 2 }