js 浅析栈内存和堆内存
Posted lsboom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表示我们不能去改变栈内存中的值,但是堆内存中的值却可以改变。
以上是关于js 浅析栈内存和堆内存的主要内容,如果未能解决你的问题,请参考以下文章