根据一道经典面试题探索JavaScript内存存储原理

45 阅读1分钟

a.xb.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 }现实中谁这么写代码要被打死吧,但是我们需要借助这行代码理解变量在内存中是怎么流转的

  1. 在栈中创建了一个引用a,在堆中创建了一个对象{ n: 1 },将a指向{ n: 1 }

image.png

  1. 在栈中创建一个引用b,将b指向{ n: 1 },这意味着当通过a或b改变{ n: 1 }对象时,改了其中一个,另一个会跟着变

image.png

  1. a.x = a = { n: 2 }
  • 在内存中会先执行a.x =,在旧对象{ n: 1 }中创建了一个属性x,

  • 在给属性x赋值时发现a后面还有一个=号,因为赋值操作是从右到左的,所以a.x = a = { n: 2 }会变成a.x = (a = { n: 2 }),此时属性x为未赋值状态,

image.png

  • 执行a = { n: 2 }时,会在堆中创建一个新对象{ n: 2 }并将引用a重新指向新对象,

image.png

  • 在执行a.x = a时,实际上操作的是旧对象{ n: 1 },于是给这个旧对象设置了属性x,值为{ n: 2 }

image.png

最终结果a为{ n: 2 },b为{ n: 1, x: { n: 2 } }