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
Last Updated: