在 JavaScript 中,变量的存储方式取决于其类型:
一、基础类型(Primitive Types)
包括:undefined,null,boolean,number,string,symbol,bigint
存储特点:
- 直接存储在**栈内存(Stack)**中
- 变量保存的是实际值
- 赋值操作会创建值的副本
leta=10;letb=a;// b 获得 a 的副本a=20;// 修改 a 不影响 bconsole.log(b);// 输出 10(值不变)二、引用类型(Reference Types)
包括:Object,Array,Function,Date等
存储特点:
- 实际数据存储在**堆内存(Heap)**中
- 变量保存的是指向堆内存地址的指针
- 赋值操作仅复制指针(浅拷贝)
letobj1={name:"Alice"};letobj2=obj1;// obj2 复制 obj1 的指针obj1.name="Bob";// 修改堆内存中的数据console.log(obj2.name);// 输出 "Bob"(指针指向同一数据)三、内存机制对比
| 特性 | 基础类型 | 引用类型 |
|---|---|---|
| 存储位置 | 栈内存 | 堆内存 |
| 赋值行为 | 复制值本身 | 复制指针(内存地址) |
| 比较操作 | 值相等即可(5 === 5) | 需指针相同({} !== {}) |
| 内存管理 | 随栈帧销毁自动回收 | 需通过垃圾回收机制(GC) |
四、关键差异说明
函数参数传递:
functionchangePrimitive(val){val=100;// 不影响外部变量(值传递)}functionchangeReference(obj){obj.prop="changed";// 修改堆内存(指针传递)}深拷贝解决方案:
// 引用类型需显式深拷贝才能完全独立constoriginal={a:1,b:{c:2}};constdeepCopy=JSON.parse(JSON.stringify(original));
理解这两种存储机制对避免 JavaScript 的常见陷阱(如意外修改共享对象)至关重要。