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"]。由于对象包含数千个属性,内存主要消耗在字符串键上,故关注内存占用情况:
obj3是否会复用obj1和obj2的字符串键(字符串驻留),还是内存消耗接近obj1与obj2之和?- 对比以下保留来源标记的实现方案:
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
相关产品推荐
相关产品推荐

