前言
之前在学习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也会随之改变