在连续表达式中,JavaScript 的计算方向是从左到右的。所以在表达式中进行连续赋值时,左侧已计算完毕的结果(引用)并不会随右侧的赋值表达式运算而更新。具体代码如下:
var a={n:1}
var ref=a
// 表达式从左到右执行,先计算了 a.x 的引用并保留等待后续运算
// 之后计算的 a={n:2} 改变了 a 的引用,但这不影响已计算好的 a.x 的引用
// 即 a.x 中的 a 指向原对象,也就是 ref 的引用
// 所以 a 的新引用中属性 x 未被赋值,而 a 的旧引用中的属性 x 被赋值了,即 ref.x 被赋值
a.x=a={n:2}
a // {n: 2}
ref // {n: 1, x: {n:2}}
ref.x===a // true
----- 极客时间《JavaScript 核心原理解析》学习笔记 Day 3 -----