a.x = a = {n: 2}
var a = {n: 1}
a.x = a = {n: 2}
console.log(a) // {n: 2}
console.log(a.x) // undefined
第2行代码是连续赋值表达式,它由两个表达式组成:
a.x =a = {n: 2}
根据《JavaScript 权威指南》4.7.7 运算顺序的描述:
JavaScript 总是严格按照从左至右的顺序来计算表达式
拆解第二行代码执行过程:
- 计算表达式
a.x的结果- 计算单值表达式
a,得到a的引用,原始对象{n: 1} - 将右侧的名字
x理解为一个标识符,并作为.运算的右操作数 - 计算
a.x表达式的结果(Result)
- 计算单值表达式
a = {n: 2},把变量a指向一个新的地址a.x = {n: 2},相当于给原始对象{n: 1}加了一个属性x
其实把上面代码等价于下面的代码就好理解了:
var a = {n: 1}, ref = a
a = {n: 2}
ref.x = a
console.log(a) // {n: 2}
console.log(a.x) // undefined