原始类型和引用类型在内存中的区别是什么?
核心区别
| 特性 | 原始类型 | 引用类型 |
|---|---|---|
| 存储位置 | 栈内存(Stack) | 堆内存(Heap) |
| 存储内容 | 值本身 | 指向堆内存的引用地址 |
| 赋值行为 | 值拷贝(深拷贝) | 引用拷贝(浅拷贝) |
| 大小 | 固定,占空间小 | 不固定,可动态变化 |
| 生命周期 | 函数结束自动回收 | 由 GC 管理 |
赋值行为对比
// 原始类型 — 值拷贝
let a = 10
let b = a
b = 20
console.log(a) // 10(互不影响)
// 引用类型 — 引用拷贝
let obj1 = { name: 'Tom' }
let obj2 = obj1
obj2.name = 'Jerry'
console.log(obj1.name) // 'Jerry'(指向同一对象)函数参数传递
JavaScript 只有值传递,但引用类型传递的是地址的副本:
function modify(obj) {
obj.name = 'modified' // 修改同一对象,外部可见
obj = { name: 'new' } // 重新赋值,不影响外部
}
let data = { name: 'original' }
modify(data)
console.log(data.name) // 'modified'