深拷贝仅生成独立副本,不实现合并;配置合并需用deepMerge等工具递归融合字段,深拷贝仅作保护默认配置或确保缓存引用唯一的安全前提。

深拷贝本身不直接实现“合并与覆盖”,它只是确保源对象不被修改;真正负责合并逻辑的是 deepMerge 这类工具函数。配置文件的深度合并,核心是“保留默认结构 + 有选择地覆盖用户传入字段”,而深拷贝常作为安全前提或中间步骤参与其中。
为什么不能只靠深拷贝做配置合并
深拷贝(如 _.cloneDeep 或 JSON.parse(JSON.stringify()))只生成一个完全独立的副本,但它不会自动把两个对象的属性递归融合。比如:
- 默认配置:
{ info: { city: 'Beijing', hobbies: ['reading'] } } - 用户配置:
{ info: { city: 'Shanghai' } }
若仅对用户配置深拷贝,得到的仍是 { info: { city: 'Shanghai' } },hobbies 就丢失了——这不是合并,是替换。
深度合并才是配置合并的正确姿势
用 deepmerge(或 Lodash 的 _.merge)才能实现嵌套层级的智能融合:
- 同名基础类型(string/number/boolean):用户值覆盖默认值
- 同名对象:递归合并,不丢子属性
- 同名数组:默认拼接;加
arrayMerge: overwriteMerge可改为覆盖
示例:
const defaultCfg = { info: { city: 'Beijing', hobbies: ['reading'] }, theme: 'light' };
const userCfg = { info: { city: 'Shanghai' }, theme: 'dark' };
const final = merge(defaultCfg, userCfg);
// → { info: { city: 'Shanghai', hobbies: ['reading'] }, theme: 'dark' }
深拷贝在合并流程中的典型作用
它主要出现在两类关键环节:
-
保护原始默认配置:先深拷贝一份默认配置,再用
merge合并用户配置,避免意外污染原始模板 -
缓存依赖安全判断:React 中
useMemo依赖项含对象时,若传入的是浅拷贝对象(如{...obj}),内部引用未变,缓存可能失效;深拷贝+合并后的新对象能确保引用唯一,触发正确缓存
推荐组合方案(生产可用)
不建议手写递归 merge,优先使用成熟库:
-
npm install deepmerge:轻量、无依赖、API 简洁,适合配置合并场景 -
npm install lodash:用_.merge(深度合并) +_.cloneDeep(保护源对象)双保险 - 避免
JSON.parse(JSON.stringify(obj)):会丢函数、undefined、Date、RegExp、循环引用,不可用于真实配置对象


















