基本数据类型和引用类型的存储位置问题+复制问题
基本数据类型和引用类型的存储位置问题+复制问题
- 1.存储位置
- 2. 复制行为
- 3. 与引用类型的对比
- 总结
在JavaScript中,基本数据类型(
number
、
string
、
boolean
、
null
、
undefined
、
symbol
、
bigint
)
1.存储位置
- 基本数据本身:直接存储在 栈内存(Stack Memory)中。
栈内存适合存储轻量、固定大小的数据,且生命周期与作用域绑定(如函数执行结束即释放)。 - 例外情况:
某些情况下,引擎可能将基本类型数据存储在堆内存(Heap Memory)中,例如:- 当基本类型数据被闭包长期引用时(需延长生命周期)。
- 非常大的字符串
bigint
(引擎可能优化内存分配)
但这些细节由JavaScript引擎内部管理,对开发者透明,逻辑上仍表现为“按值访问”。
2. 复制行为
- 直接复制值:
当复制基本类型数据(如let b = a
)时,会在栈内存中创建一独立的新副本,与原数据完全隔离,修改其中一个变量,不会影响另一个。
let a = 10;
let b = a; //栈中创建新副本,b=10
a = 20; // 修改a, b仍为10
- 逻辑上的“不可变性”
基本类型值本身不可变(如字符串修改会创建新值),因此复制的本质是值的“拷贝”,而非引用传递。
3. 与引用类型的对比
- 引用类型(如对象、数组):
- 数据本体储存在堆内存中。
- 变量存储的是堆内存地址(指针),指针本身在栈中。
- 复制时传递指针(地址),而非数据本身,导致多个变量指向同一数据。
总结
类型 | 存储位置 | 复制行为 |
---|---|---|
基本类型 | 栈内存(通常) | 创建独立副本,按值传递 |
引用类型 | 堆内存(数据本体)+ 栈内存(指针) | 复制指针,共享同一数据 |
- 基础类型的复制会创建该值的一个副本。
- 引用类型的复制只会复制指针,复制后的变量和付之前的变量都指向同一个对象。
JavaScrip引擎可能堆基本数据类型的存储进行优化(如堆存储大字符串),但开发者只需理解逻辑行为,基本数据类型按值复制,引用类型按引用复制