# 连续赋值的理解
# 例子
var a = {n: 1}
var b = a
a.x = a = {n: 2}
console.log(a.x)
console.log(b)
# 理解
- 首先
b = a
,就是一个浅拷贝,大家都指向同一个地址。 - 其次连续赋值运算法则从右向左执行,所以先执行
a = {n: 2}
,于是a
的新值等于了{n: 2}
。这里特别注意,这个a
已经不是开头的那个a
,而是一个全新的a
,这个新a
指针已经不是指向原来的值的那个堆内存,而是分配了一个新的堆内存。但是原来旧的堆内存因为还有b
在占用,所以并未被回收。 - 因此这时候接着执行
a.x = {n: 2}
,实际上就是b.x = {n: 2}
。 - 最终
a = {n: 2}
,b={n: 1, x: {n: 2}}
。 - 所以输出
a.x
输出为undefined
。
# 扩展
var a = {x: 1}
var b = a
a.x = a = {n: 1}
console.log(a)
console.log(b)
可以用这个例子再理解一次。