JavaScript中多个相同原始值是否共享同一内存位置?
我们先来看如下代码片段:
let a = 10; let b = 10 printNumber(10) function printNumber(num){ console.log(num) }
针对代码里的疑问,直接给结论:
- 首先从ECMAScript语言规范层面,没有强制要求相同原始值必须共享内存位置:原始值是不可变的值类型,变量存储原始值时持有的是值本身,而非指向堆对象的引用,规范把内存复用的实现权限完全交给了JS引擎。
- 从主流JS引擎(V8、SpiderMonkey、JavaScriptCore)的实际实现来看,你例子里的字面量
10确实只会存储一份,不会出现多份冗余:- 像10这类范围很小的整数,属于引擎预定义的小整数(比如V8里的Smi类型),根本不会单独分配堆内存,值本身直接编码在变量的存储位/寄存器里,所有用到这个值的位置都会复用同一个编码结果,不存在重复存储的可能。
- 对于代码里写死的原始值字面量(包括数字、字符串、布尔值等),引擎在解析编译阶段就会把这些值收集到常量池,相同的常量只会保留一份,后续所有引用该常量的位置都会直接指向常量池里的同一份数据,不会因为你代码里写了成百上千次相同的字面量就重复占用内存。
- 要额外注意:这个常量复用机制只覆盖编译阶段就能确定值的字面量。如果是运行时动态计算得到的相同原始值,引擎不一定会主动做去重,比如运行时拼接得到的相同字符串、运算得到的相同数字,可能会存在临时的独立存储,但这类值生命周期很短,会被垃圾回收机制快速清理,不会造成持续的内存冗余膨胀。
你示例代码里的三个10都是写死的数字字面量,编译阶段就会被识别为同一个常量,实际运行时不会存储三份独立的10,哪怕你在源码里写几万次这个字面量,也不会导致内存因为这个原因无意义膨胀。
内容的提问来源于stack exchange,提问作者Al3ksandre
相关产品推荐
相关产品推荐

