# 连续赋值的理解

# 例子

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

# 理解

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

# 扩展

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

可以用这个例子再理解一次。