You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:24:45