跳到主要内容

连续赋值

· 阅读需 2 分钟

面试题:

var a = { n: 1 }
var b = a
a.x = a = { n: 2 }
console.log(a.x)
console.log(b.x)

前两行代码很容易理解,下面是其内存示意图:

image-20240318105644305

赋值运算,我们常规的分析思路是先处理右边的,在把计算结果给左边即可

但实际上,是先要根据左边定位其内存空间,再把右边的返回值赋值给左边

第三行代码相当于,将表达式 a = { n: 2 } 的返回值,赋值给 a.x

定位:先确定 a.x 的内存空间,在堆上开辟一个属性 x,但属性值未知

image-20240318105541223

然后处理右边表达式 a = { n: 2 }

先定位 a 的内存空间,在堆上开辟一块内存空间 { n: 2 },然后修改 a 的指向为新对象

image-20240318105131547

该表达式的返回值就是 a 变量此时指向的新地址,因此 x 属性的值也被确定了

image-20240318105443005

显而易见,此时 a.xundefinedb.x{ n: 2 }