堆内存 & 栈内存
[[toc]]
前几天面试刚问到的 ,这几天有空话总结下
在js引擎中对变量的存储主要有两种内存,堆内存(heap)和栈内存(stack),下面从三个方面简单介绍
存储角度
栈内存 主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null
以及对象变量的指针
,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。
堆内存 主要负责像对象Object
这种变量类型的存储
盗用一张图
我们平时用const
定义的常量,如果是引用数据类型的话,仅仅是在栈内存保存的一个指针,而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。当let cosnt
在重新声明的时候,会首先遍历当前的内存栈
,看看有没有重名变量,有的话就返回错误
存取速度
栈区由于基本数据类型值比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存储进去的,系统分配效率高,存取速度快
堆内存首先要在运行时动态分配内存,之后又要把指针存储到栈内存中,效率相对就要低一些了。
GC
栈区GC比较频繁,变量基本上用完就回收了
堆区内存中的变量因为存在很多不确定的引用,一般由程序员分配释放, 若程序员不释放,程序结束时才可能被销毁