推荐用 structuredClone 实现深拷贝快照,它简洁安全、支持常见类型且自动处理循环引用;旧环境可用 JSON 方案(有数据类型限制);复杂场景建议用 lodash.cloneDeep 保障兼容性与稳定性。

深拷贝配置对象做快照,核心是确保新对象与原对象完全独立——修改快照不会影响原始配置,修改原始配置也不会波及快照。
为什么浅拷贝不行
像 Object.assign({}, config) 或展开运算符 {...config} 只复制第一层属性。如果配置里有嵌套对象或数组,这些内部引用仍会共享。一旦修改 config.nested.option,快照里的对应字段也会变。
推荐用 structuredClone(现代浏览器 & Node.js 17+)
这是目前最简洁、安全的原生方案,能正确处理对象、数组、Date、RegExp、Map、Set 等常见类型,且自动跳过函数、undefined、Symbol 和循环引用(抛错提示)。
- 直接调用:
const snapshot = structuredClone(config); - 适合大多数 JSON-like 配置场景,无需额外依赖
- 注意:不支持函数、BigInt、Error 对象等——若配置中含这些,需手动过滤或换方案
兼容旧环境可用 JSON 方案(有限制)
当需要支持较老运行时,可借助 JSON.parse(JSON.stringify(config)),但必须清楚它的边界:
立即学习“Java免费学习笔记(深入)”;
- 只适用于纯数据对象(无函数、undefined、Symbol、Date、RegExp、Map、Set)
- Date 会变成字符串,正则变成空对象,undefined 和函数会被丢弃
- 若配置确定是简单结构(如 { host: 'a.com', port: 8080, flags: [true, false] }),它够用且轻量
复杂场景建议用成熟库(如 lodash.cloneDeep)
当配置可能含函数、正则、特殊类实例或需稳定跨环境行为时,lodash 的 cloneDeep 更可靠:
- 安装:
npm install lodash,然后import { cloneDeep } from 'lodash'; - 使用:
const snapshot = cloneDeep(config); - 它能保留 Date、RegExp、Map、Set、自定义类实例(部分情况),也处理循环引用
- 代价是引入外部依赖,体积略大,但稳定性高


















