JS内存管理的堆和栈指向赋值问题
2019-08-07 本文已影响0人
infi_
timg.jpg
一般这里是最绕最容易迷路的地方
下面我用最大白话的方式给它解释清楚
题目是这样的
var a={n:1}
var b=a
a.x=a={n:2}
console.log(a)
console.log(b)
连续赋值之后 求现在的a 和b 的样子是什么样的
栈:系统自动分配 物理内存连续 x=1 x相当于酒店门牌号 1相当于住在里面的人 放进栈里。
堆::动态创建 物理内存不连续 x={n:1} 放进堆里面
这段赋值运行起来是什么流程呢
一般官方说法很绕口也很难懂
可以用大白话解释比较好懂
第一步 a相当于酒店的门牌号 由于里面是一个对象{n:1} 是一个复杂对象体积太大 所以放不下
里面只住着这个对象的指针也就是联系方式
第二步 b也是相当于酒店的门牌号 同上也住着指向对象的联系方式
第三步 也就是a={n:2}这一部分 改变了a房间的联系方式也就是指针 指向了一个新对象 此时b还是指向原来的老对象
此时b={n:1}
第四步 这一步相当关键 也就是会在原来的对象{n:1}上添加一个属性X 指向新的对象{n:2} 而此时b正指向原来的对象没变
此时b={n:1,x:{n:2}}
此时a={n:2}
这就是这个最简单的解释方法