JSON.parse(JSON.stringify(obj))不是真正深拷贝,会丢失函数、Date、RegExp、Map、Set、undefined、Symbol等类型,且无法处理循环引用;推荐使用fast-copy或structuredClone等健壮方案。

直接用 JSON.parse(JSON.stringify(obj)) 处理复杂对象拷贝,大概率会出问题——函数、Date、RegExp、Map、Set、undefined、Symbol、循环引用全都会丢失或报错。真正可靠的方案得兼顾类型覆盖、性能和健壮性。
优先考虑 fast-copy:高性能 + 全类型支持
fast-copy 是专为复杂对象设计的现代深拷贝库,不是“又一个 cloneDeep 替代品”,而是从底层算法优化的产物:
- 原生支持
Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Blob等 20+ 类型,无需额外配置 - 自动识别并正确处理循环引用,比如
obj.self = obj这类结构不会卡死或报错 - 在简单对象场景下比
lodash.cloneDeep快约 80%,大数据量时优势更明显(实测 >325 次/秒 @1MB 对象) - 安装轻量:
npm install fast-copy,使用极简:import { copy } from 'fast-copy'; const cloned = copy(original);
慎用 JSON 方法:只适合纯数据对象
如果你确认对象里只有字符串、数字、布尔、null、普通对象和数组(即符合 JSON 格式),那 JSON.parse(JSON.stringify(obj)) 仍可作为零依赖的快捷方案:
- 优点是快、简洁、无外部依赖
- 但一旦出现
new Date()→ 变成字符串;/test/g→ 变成空对象;function() {}→ 直接消失;undefined属性被跳过;Symbol键被忽略 - 遇到循环引用直接抛
TypeError: Converting circular structure to JSON
需要精细控制时:用自定义拷贝器或严格模式
fast-copy 提供了进阶能力,适合有特殊需求的场景:
立即学习“Java免费学习笔记(深入)”;
- 保留不可枚举属性、getter/setter、属性描述符?用
copyStrict() - 只想深拷贝某几类字段,其余保持引用?通过
createCopier()自定义规则 - 对接 React 组件或自定义类实例?fast-copy 默认支持构造函数还原,也可手动指定序列化逻辑
简单嵌套不深?先试试浅拷贝组合
如果对象只有 1–2 层嵌套,且你只关心避免顶层修改影响原对象,浅拷贝往往更高效、更可控:
- 对象:用扩展运算符
{...obj}或Object.assign({}, obj) - 数组:用
[...arr]、arr.slice()或arr.concat() - 注意:这些方法对嵌套对象/数组仍是引用,需手动处理深层部分(例如
{ ...obj, details: { ...obj.details } })


















