JavaScript 变量与堆和栈的关系
JS 八种数据类型
JS 是动态语言,变量可以随时持有任何类型的数据,所以 JS 的变量是没有数据类型的,值才有数据类型。
JS 值有 8 种数据类型:
- Boolean: true / false
- Undefined:没有被赋值的变量或变量被提升时的,都会有个默认值 undefined
- Null:只有一个值 null
- Number:数字类型
- BigInt(ES10):可以表示任意大的整数(大于 253 - 1 的整数)
- String:字符
- Symbol(ES6):每个从Symbol()返回的symbol值都是唯一的
- Object:对象类型(Date/Array/Funtion/Set/Map/WeakSet/WeakMap)
栈
栈是内存中一块用于存储局部变量和函数参数的线性结构,遵循着先进后出 (LIFO / Last In First Out) 的原则。ECMAScript为数组专门提供了 push() 和 pop() 方法,以便实现类似栈的行为。
堆
堆数据结构是一种树状结构。它的存取数据的方式与书架和书非常相似。我们只需要知道书的名字就可以直接取出书了,并不需要把上面的书取出来。
在栈中存储不了的数据比如对象就会被存储在堆中,在栈中只是保留了对象在堆中的地址,也就是对象的引用 ,对于这种,我们把它叫做 按引用访问 。
所以
JS 中,基本类型的数据是存放在栈中,引用类型的数据是存放在堆中的。堆中的数据是通过引用和变量关联起来的。
注意
闭包除外,JS 闭包中的变量值并不保存中栈内存中,而是保存在堆内存中