js 浅析栈内存和堆内存

我们都知道js中定义变量的方式有var、let、const,let和const是es6中新增定义变量的方式,具体特性这里不再阐述。现在我们用const定义一个对象:

// const定义了一个obj对象
const obj = { a: 1, b: 2}
// 改变obj的值会报错
obj = {};
// 这样却可以成功
obj.a = 2;
console.log(obj.a);

可以看到如果直接给obj赋值为一个新对象,这时会因为const的限制报错,但是去改变obj里面的某个属性值却可以成功,为啥?下面来讲讲:

js中有栈内存和堆内存,栈内存主要是存储一些有固定大小或者有大小限制的值,堆内存主要是存储一些大小不定,动态分配大小的值。

js里面基本数据类型有String、Boolean、Number、null、undefined、symbol,引用数据类型有Array、Object、Date、RegExp等。我们在定义基本数据类型的值时,js会把它的值存储进栈内存中,可以直接去改变它的值,而当我们定义一个引用数据类型时,此时是分为两个步骤,首先因为我们的值大小是不固定的,所以需要存进堆内存中,其次js会创建一个指针(也就是一个key,对应堆内存中的值),指向存进去的这块数据,然后把这个指针存进栈内存中,通俗讲就是js在栈内存中存储了当前引用数据类型的堆内存地址,我们使用某个对象时其实是通过这个内存地址去引用堆内存中的值。

现在我们再来解释上面const的问题,const表示我们不能去改变栈内存中的值,但是堆内存中的值却可以改变。

posted @ 2020-08-06 12:59  lsboom  阅读(400)  评论(0编辑  收藏  举报