JS修改变量赋值后原数值是否留存于内存?结合原始类型不可变特性咨询
JavaScript 原始类型赋值与内存存储原理
核心问题直接解答
你给出的示例中,数值7不会长期留存于内存中,具体原理结合原始类型不可变的特性拆解如下:
先明确两个基础概念
- 变量和值是两个独立的存储单元:
let a = 7实际执行了两个操作:首先在内存中创建原始类型值7,再声明变量a,让a存储7的内存地址(也就是常说的“变量a指向7”)。 - 原始类型的*不可变性(immutable)*指的是值本身一旦创建就无法修改,而非指向该值的变量不能更换指向。
你的代码执行逻辑拆解
let a = 7; // 步骤1:创建原始值7,a指向7的内存地址 a = 3; // 步骤2:创建新的原始值3,将a的指向修改为3的地址,此时7不再被任何变量引用 console.log(a); // 读取a当前指向的值,输出3
数值7的内存去向
代码执行完
a = 3后,值7已经没有任何可达引用,属于可回收的垃圾内存。
不同JS引擎的垃圾回收触发时机不同,7可能会在内存中短暂留存到下一次垃圾回收周期,之后占用的内存就会被释放复用。如果当前上下文还有其他变量同时指向7,那7会保留到所有引用它的变量都销毁/改指向之后才会被回收。
不可变性和变量赋值的关系
很多初学者会混淆“变量改赋值”和“原始值不可变”,两者完全不冲突:
你永远无法修改已经创建的原始值本身,比如不可能把内存里的7改成其他数字,所有对原始值的操作本质都是创建新的原始值,或者修改变量的指向,不会改动原始值本身。你之前了解到的原始类型不可变的知识点是完全正确的。
补充说明
部分JS引擎会对小整数做缓存优化(比如V8引擎的Smi小整数类型),这种场景下7可能会被长期缓存,但这是引擎层面的性能优化,不会对代码逻辑和运行结果产生任何影响,不需要在业务开发中额外考虑。
内容的提问来源于stack exchange,提问作者ulisse0744
相关产品推荐
相关产品推荐

