堆内存 & 栈内存

[[toc]]

前几天面试刚问到的 ,这几天有空话总结下

在js引擎中对变量的存储主要有两种内存,堆内存(heap)和栈内存(stack),下面从三个方面简单介绍

存储角度

栈内存 主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。

堆内存 主要负责像对象Object这种变量类型的存储

盗用一张图

我们平时用const定义的常量,如果是引用数据类型的话,仅仅是在栈内存保存的一个指针,而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。当let cosnt在重新声明的时候,会首先遍历当前的内存栈,看看有没有重名变量,有的话就返回错误

存取速度

栈区由于基本数据类型值比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存储进去的,系统分配效率高,存取速度快

堆内存首先要在运行时动态分配内存,之后又要把指针存储到栈内存中,效率相对就要低一些了。

GC

栈区GC比较频繁,变量基本上用完就回收了

堆区内存中的变量因为存在很多不确定的引用,一般由程序员分配释放, 若程序员不释放,程序结束时才可能被销毁