如何理解JavaScript中的堆和栈

什么是堆和栈?

堆和栈讲的是内存的分配和使用,与硬盘寄存器无关。

堆用来存储引用类型数据比如Object,Function,new开头的包装类型,这样说也不准确,因为它的指针引用存到栈中。

栈用来存储值类型的,比如Null,Number,String,Boolean,Symbole,Udefiend。

二者区别

栈内存是自动分配相对固定大小的内存空间,并由系统自动释放。方便操作和管理。

堆内存是动态分配内存,内存大小不一,也不会自动释放。方便开辟新的内存空间。

传值和传址

var arry = [1,2,3];
var arry1 = arry;//arry,arry1,[1,2,3]

var str = arry[0];
arry[0] = 0;//arry,arry1,[0,2,3]

console.log(str);//1
str = 100;//arry,arry1,[0,2,3]

因为arry[0]是值类型,所以当把arry[0]赋值给str时,实际上是把堆中arry[0]的值复制了一份到了栈中,由于栈内存和堆内存不是相同的一块空间,因此互不影响,所以arry[0]或者str值改变了都不会互相影响。

因为arry是一个引用类型,所以当把arry赋值给arry1时,程序会在栈中开辟一块空间,然后把arry存放到栈中的引用(指针)赋值给这块新的栈内存,所以,栈内存中此时有两块空间指向同一个堆内存,再加上对象进行操作时由于操作的是引用,arry和arry1两者有其一发生变化都会互相影响共同的堆内存块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挽枫blog

打赏是对知识的尊重!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值