a.x和b.x分别会打印什么
var a = { n: 1 }
var b = a
a.x = a = { n: 2 }
console.log(a.x)
console.log(b.x)
a.x = a = { n: 2 }现实中谁这么写代码要被打死吧,但是我们需要借助这行代码理解变量在内存中是怎么流转的
- 在栈中创建了一个引用a,在堆中创建了一个对象{ n: 1 },将a指向{ n: 1 }
- 在栈中创建一个引用b,将b指向{ n: 1 },这意味着当通过a或b改变{ n: 1 }对象时,改了其中一个,另一个会跟着变
- a.x = a = { n: 2 }
-
在内存中会先执行a.x =,在旧对象{ n: 1 }中创建了一个属性x,
-
在给属性x赋值时发现a后面还有一个=号,因为赋值操作是从右到左的,所以a.x = a = { n: 2 }会变成a.x = (a = { n: 2 }),此时属性x为未赋值状态,
- 执行a = { n: 2 }时,会在堆中创建一个新对象{ n: 2 }并将引用a重新指向新对象,
- 在执行a.x = a时,实际上操作的是旧对象{ n: 1 },于是给这个旧对象设置了属性x,值为{ n: 2 }
最终结果a为{ n: 2 },b为{ n: 1, x: { n: 2 } }