谈谈JS的栈(stack)和堆(heap)

前言

之前在学习js的时候就已经知道栈和堆了,但老是忘记,对这两个概念很混淆,今天特地又去学习了一遍,特此记录一下,温故知新

在JS中,我们知道数据类型分为

  • 原始类型(number, string, boolean, null, undefined)
  • 引用类型(object) => Array, function, data, RegExp

原始类型都是保存在栈当中,引用类型都是保存在堆当中

举个例子

var a = 123  // 是原始类型,会在栈底部,创建一个叫做a的房间,里面放入123

 

var a = 123 // 是原始类型,会在栈底部,创建一个叫做a的房间,里面放入123

var b = a  // 再创建一个房间b,将a房间的值copy一份放在b房间

var a = 123 // 是原始类型,会在栈底部,创建一个叫做a的房间,里面放入123

var b = a  // 再创建一个房间b,将a房间的值copy一份放在b房间

a = 124 // 再创建一个房间a,里面放入值124,将之前房间a名字删掉,但里面值不删

 

因为原始值是不可改变的,只会改房间编号,并不会删除房间内的值,所以放在栈中的数据会一直放在底部。就像相机一样,我们删除照片的时候,只是把照片名删掉了,实际内存中还是会存有数据,所以我们要是想销毁数据,就只能大量往内部存照片,覆盖之前的数据就可以了


下面再看堆

var arr = [1, 2] // 会在栈内命名一个arr的房间,但一看值是个引用类型,就会把值放在堆里面,同时arr房间里面存着[1, 2]的房间名

var arr1 = arr // 再在栈内创建一个arr1, 将arr拷贝一份放在arr1房间内,但是,拷贝的只是个引用地址,所以他们都是指向 堆内的[1, 2]

arr.push(3)  // 这个时候再往arr push 数据的时候 就是在堆内添加数据,所以arr1也会随之改变

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值