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 闭包中的变量值并不保存中栈内存中,而是保存在堆内存中

posted @ 2021-04-16 10:28  Mr.曹  阅读(204)  评论(0编辑  收藏  举报