JavaScript中基本类型(如Number、String等)逻辑上存于栈,值拷贝;引用类型(如Object、Array等)数据存于堆,栈存地址,地址拷贝。引擎自动管理,行为模型始终一致。

JavaScript 中数据类型是否存于栈或堆,主要看它是基本类型还是引用类型,而不是由开发者手动指定。这种区分是引擎自动完成的,核心依据是值的大小是否固定和生命周期是否明确。
基本类型:绝大多数存在栈中(逻辑上)
包括 Number、String、Boolean、null、undefined、Symbol、BigInt。它们值小、结构固定,适合快速存取。
- 数值如
let age = 25,直接把25存在栈里 - 短字符串(如
"a"或"hello")多数引擎也优先放栈,但长字符串会进堆——这是引擎优化细节,开发者无需干预 - 赋值时是值拷贝:
let a = 10; let b = a;→a和b各占一份独立空间,互不影响
引用类型:真实数据存堆,栈中只存地址
包括 Object、Array、Function、Date、RegExp、Map、Set 等所有对象类型。它们结构可变、体积不定,必须动态分配空间。
-
const user = { name: "Alice" };→ 对象内容{ name: "Alice" }存在堆中;栈中只存一个指向它的内存地址 - 赋值时是地址拷贝:
const u2 = user;→u2和user栈中地址相同,指向堆中同一块数据 - 修改属性(如
u2.name = "Bob")会影响user.name,因为操作的是同一个堆对象
注意几个关键事实
规范不强制物理位置,实际存储由引擎(如 V8)按需优化。但行为模型始终一致:
立即学习“Java免费学习笔记(深入)”;
- 基本类型变量名 → 直接对应值本身(栈视角)
- 引用类型变量名 → 对应一个指针,指针在栈,目标在堆
- 函数调用过程中的参数、局部变量、执行上下文,都依赖栈的 LIFO 特性管理
- 堆中对象何时释放?靠垃圾回收器(GC)标记-清除,不是函数退出就立刻消失
一个直观对比示例
// 栈中:a=100,b=100(两个独立值)
// 堆中:{ x: 1 }(一份数据)
// 栈中:obj1=0x001,obj2=0x001(两个相同地址)
let a = 100;<br>let b = a;<br>b = 200;<br>console.log(a); // 100<br><br>const obj1 = { x: 1 };<br>const obj2 = obj1;<br>obj2.x = 99;<br>console.log(obj1.x); // 99


















