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

Chrome中JS对象合并是否复用字符串?哪种实现内存更优?

问题

现有如下两个对象:

let obj1 = {
  "ac": 1,
  "com.ac": 1,
  "edu.ac": 1,
  "gov.ac": 1,
  "net.ac": 1,
  "mil.ac": 1,
  "org.ac": 1
  // ... 更多属性
}

let obj2 = {
  "accident-investigation.aero": 1,
  "accident-prevention.aero": 1,
  "aerobatic.aero": 1,
  "aeroclub.aero": 1,
  "aerodrome.aero": 1,
  // ... 更多属性
}

let obj3 = {...obj1, ...obj2};

为简化键存在性检查,将二者合并为obj3,只需一次调用let value = obj3["someKey"]。由于对象包含数千个属性,内存主要消耗在字符串键上,故关注内存占用情况:

  1. obj3是否会复用obj1和obj2的字符串键(字符串驻留),还是内存消耗接近obj1与obj2之和?
  2. 对比以下保留来源标记的实现方案:
let obj4 = {
  "ac": {
    offset: 1,
    fromObj1: true
  },
  "accident-investigation.aero": {
    offset: 1,
    fromObj1: false
  },
  // ... 更多属性
}

obj1 + obj2 + obj3与obj4哪种内存消耗更优?

回答

问题1解答

obj3会复用obj1和obj2的字符串键,内存消耗远低于obj1与obj2之和。

JavaScript主流引擎(如V8)会对字符串做字符串驻留处理:内容完全相同的字符串,内存中只会保留一份实例。用扩展运算符合并对象时,obj3的键只是引用obj1、obj2已有的字符串实例,不会生成新的字符串副本。新增内存仅为obj3自身的对象结构(比如属性哈希表),这部分消耗相对于数千个字符串键可以忽略。

问题2解答

obj4的内存消耗更优。

具体分析:

  • obj1 + obj2 + obj3要维护三个独立对象,即便字符串键能复用,三个对象的属性结构(哈希表、属性描述符等)会占用额外内存;且obj3是obj1、obj2属性的重复存储,每个属性的键值对条目都会占用内存。
  • obj4是单个对象,所有属性仅存储一次:字符串键同样享受驻留优化,每个键对应一个含两个字段的小型对象。相比三者之和,obj4省去了三个对象的结构开销,也避免了属性条目重复存储,整体内存占用明显更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:28:28