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

JavaScript是否共享字符串实例?内存占用及验证方法问询

JavaScript中相同字符串字面量的内存引用问题

核心问题解答

对于你写的代码:

let x="hello"
let y="hello"

主流JavaScript引擎(比如Chrome的V8、Firefox的SpiderMonkey)会对字符串字面量执行**字符串驻留(String Interning)**优化——也就是说,x和y会指向内存中同一个字符串实例,而非两个内容相同的独立字符串。

这种优化的目的是减少内存占用:如果有大量重复的字符串字面量,实际只需要存储一份字符串内容,所有变量都共享这个引用。所以你提到的40个12字符相同字符串,内存占用是单个字符串的大小(加引擎的对象开销),而非40倍;百万个1000字符的相同字面量字符串同理,只会占用一份1000字符的内存空间。

不过要注意例外情况:

  • 动态生成的字符串(比如复杂拼接结果)、通过new String('hello')创建的字符串包装对象,不会被自动驻留,这类情况会生成独立的实例。
  • 字符串驻留是引擎的实现细节,没有在ECMAScript标准中强制要求,不同引擎的优化范围可能略有差异,但字面量字符串的驻留是普遍行为。

如何验证引用是否相同

由于JavaScript中字符串是基本类型,直接用===或Object.is()比较的是值而非引用,无法直接判断是否指向同一实例。可以通过以下方法验证:

方法1:利用字符串包装对象的引用比较

基本类型字符串会在需要时自动包装成String对象,如果原始字符串是同一引用,包装后的对象也会是同一个:

let x = 'hello';
let y = 'hello';
// 将字符串包装为对象
const wrappedX = Object(x);
const wrappedY = Object(y);
// 比较包装对象的引用
console.log(wrappedX === wrappedY); // 输出 true,说明x和y指向同一字符串实例

方法2:使用WeakSet检测

WeakSet只能存储对象,且基于引用判断是否存在:

let x = 'hello';
let y = 'hello';
const set = new WeakSet();
set.add(Object(x));
// 检查包装后的y是否在集合中
console.log(set.has(Object(y))); // 输出 true,证明两者指向同一原始字符串

方法3:查看内存快照

在Chrome DevTools的Memory面板中:

  1. 创建大量相同的字符串字面量变量;
  2. 拍摄内存快照;
  3. 在快照中搜索该字符串,会发现只有一个实例存在,而非对应变量的数量,以此证明所有变量共享同一引用。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:03:21