js push操作时,堆栈内存发生了什么

isle
  • 5
新手上路,请多包涵

请教一个问题,js里一个数组被push进另一个数组的时候,堆内存里是怎么变化的
let a = []
let x = []
let y = []
x.push(a)
y.push(a)
如果修改a,则x和y的打印结果都会同样变化
而在x[0]中push内容,也会影响到y
x和y都指向一个内容,就像x数组和y数组都保存着a的地址一样
我知道在栈内存中a,x,y都分别保存着一个地址,但是如果是数组间互相引用的情况呢,就像上面的push互相嵌套,这个地址,又保存在哪里

回复
阅读 539
4 个回答

这个和push无关,数组赋值给谁,这个内存就保存在哪里。地址指向内存空间,但不是具体的内存空间,就像家庭住址和房子一样

例子中声明了a、x、y三个数组,会在内存中分别开辟一块空间,存放数组,然后把空间地址如0x0001、0x0002、0x0003分别赋值给a、x、y。对a、x、y的取值操作,就是根据这个地址信息,到对应的内存中去取数据,向x、y中push a的时候,添加到x、y中的就是一个内存地址,而不是真正的数据,然后向x[0]中添加数据,发现x[0]是一个内存地址(引擎会识别是地址还是真实数据),就会先根据这个地址找到对应的数据,然后再对这个数据进行后续的添加操作。这时候在取值y[0]就会发现也改变了,因为y[0]和x[0]存的都是同一个内存地址

JS不像C每一行语句都能等价转为汇编
V8这样复杂的运行时内存状态基本是个混沌系统
琢磨这个没有太大意义

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏