企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 栈与堆 JavaScript中并没有严格意义上区分栈内存与堆内存。因此我们可以粗浅的理解为JavaScript的所有数据都保存在堆内存中。但是在某些场景,我们仍然需要基于堆栈数据结构的思路进行处理,比如JavaScript的执行上下文。 ## 栈 乒乓球的存放方式与栈中存取数据的方式如出一辙。处于盒子中最顶层的乒乓球5,它一定是最后被放进去,但可以最先被使用。而我们想要使用底层的乒乓球1,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层。这就是栈空间先进后出,后进先出的特点。图中已经详细的表明了栈空间的存储原理。 ![](https://box.kancloud.cn/22426b639687d425fe8d26627682e2d1_700x550.png) ## 堆 书虽然也整齐的存放在书架上,但是我们只要知道书的名字,我们就可以很方便的取出我们想要的书,而不用像从乒乓球盒子里取乒乓一样,非得将上面的所有乒乓球拿出来才能取到中间的某一个乒乓球。好比在JSON格式的数据中,我们存储的`key-value`是可以无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。 <br> <br> # 变量对象与基础数据类型 JavaScript的执行上下文生成之后,会创建一个叫做变量对象的特殊对象,JavaScript的基础数据类型往往都会保存在变量对象中。 基础数据类型都是一些简单的数据段,JavaScript中有5中基础数据类型,分别是`Undefined、Null、Boolean、Number、String`。基础数据类型都是按值访问,因为我们可以直接操作保存在变量中的实际的值。 > 严格意义上来说,变量对象也是存放于堆内存中,但是由于变量对象的特殊职能,我们在理解时仍然需要将其于堆内存区分开来。 <br> <br> # 引用数据类型与堆内存 JS的引用数据类型,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅地理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。 ~~~ var a1 = 0; // 变量对象 var a2 = 'this is string'; // 变量对象 var a3 = null; // 变量对象 var b = { m: 20 }; // 变量b存在于变量对象中,{m: 20} 作为对象存在于堆内存中 var c = [1, 2, 3]; // 变量c存在于变量对象中,[1, 2, 3] 作为对象存在于堆内存中 ~~~ ![](https://box.kancloud.cn/2ef5be1975cc30f2aec4ea63c4a6bb99_700x400.png) 因此当我们要访问堆内存中的引用数据类型时,实际上我们首先是从变量对象中获取了该对象的地址引用(或者地址指针),然后再从堆内存中取得我们需要的数据。 <br> <br> # 内存空间管理 JavaScript的内存生命周期 ~~~ 1. 分配你所需要的内存 2. 使用分配到的内存(读、写) 3. 不需要时将其释放、归还 ~~~ <br> <br> # 参考资料 * [JS内存空间详细图解](https://www.cnblogs.com/lsgxeva/p/7976019.html)