对象合并默认为浅拷贝,性能高但存在引用共享风险;深拷贝合并可隔离数据但成本显著上升,选择取决于是否需要隔离原数据及运行时成本权衡。

对象合并本身不等于拷贝,但常用合并操作(如 Object.assign、展开运算符)默认只做浅拷贝——性能高,却隐含数据污染风险;而真正深拷贝的合并(如先深克隆再合并)成本明显上升,尤其在嵌套深、结构复杂时。区分关键不在“要不要合并”,而在“合并前是否需要隔离原数据”。
浅拷贝合并:快但共享深层引用
用 Object.assign({}, obj1, obj2) 或 {...obj1, ...obj2} 合并,仅复制第一层属性值:
- 基本类型(字符串、数字等)直接复制值,安全独立
- 引用类型(如
obj1.nested = {x: 1})只复制地址,obj2若也有nested,合并后新对象的nested仍指向原内存 - 修改
result.nested.x会同步影响obj1.nested.x或obj2.nested.x - 时间复杂度接近 O(n),n 为顶层属性数;无递归、无序列化开销,性能最优
深拷贝合并:安全但代价明确
若需合并后完全隔离,必须先深拷贝再合并,或使用支持深语义的工具:
-
structuredClone+ 展开:const merged = {...structuredClone(obj1), ...structuredClone(obj2)}——两次深克隆 + 一次浅合并,适合现代环境,能正确处理Date、Set、循环引用等 -
JSON.parse(JSON.stringify())合并:const merged = {...JSON.parse(JSON.stringify(obj1)), ...JSON.parse(JSON.stringify(obj2))}——看似简单,但会丢失function、undefined、Symbol、正则、原型链,且遇循环引用直接报错 - 手写递归合并函数:可控制类型识别与循环检测,但开发成本高,运行时性能取决于嵌套深度和属性数量,最差可达 O(n × m),m 为平均嵌套层数
性能敏感场景下的实用建议
不必为所有合并加深拷贝,按数据角色决策:
立即学习“Java免费学习笔记(深入)”;
- 配置合并(如默认配置 + 用户配置):用浅拷贝足够,本意就是覆盖/继承,不需隔离
- 状态快照(如 React 中生成不可变 nextState):优先用
structuredClone,现代浏览器已稳定支持,比手写更可靠 - 老环境兼容(IE 或旧 Node.js):避免 JSON 方案,改用轻量库如
lodash.cloneDeep,它对特殊类型有预设处理逻辑 - 超大对象(万级属性或深层嵌套):先评估是否真需深拷贝——有时用不可变更新(immer)或路径式 patch 更高效
本质上,浅拷贝合并是常数级操作,深拷贝合并是递归级操作。选哪个,取决于你愿为数据安全多付多少运行时成本。



















