深拷贝复杂嵌套对象应优先使用structuredClone();纯数据场景可用JSON.parse(JSON.stringify());全量兼容需求推荐lodash.cloneDeep;手写递归仅适合学习。

深拷贝一个复杂嵌套的引用类型对象,核心是确保每一层嵌套(包括对象、数组、Date、RegExp、Map、Set 等)都被独立复制,原对象与副本之间彻底隔离,互不影响。
优先用 structuredClone() —— 现代浏览器的标准解法
这是目前最推荐的方式,原生支持、语义清晰、兼容主流现代环境(Chrome 98+、Firefox 94+、Safari 15.4+),能正确处理循环引用、Date、RegExp、Map、Set、ArrayBuffer 等,且不丢失属性描述符(如 writable、enumerable)。
用法很简单:
const newObj = structuredClone(originalObj);⚠️ 注意:不支持 function、undefined、Symbol(和 JSON 方法一样),旧版浏览器需降级处理。
纯数据场景:JSON.parse(JSON.stringify()) 快速但有硬限制
适合只含 null、字符串、数字、布尔值、普通对象、数组的“纯数据”结构,比如接口返回的配置或表单数据。
- ✅ 优点:零依赖、性能快、一行代码
- ❌ 缺点:丢弃 function、undefined、Symbol;Date 变字符串;RegExp 变空对象;无法处理循环引用;不拷贝原型链和不可枚举属性
示例:
需要全量兼容(含函数、循环引用、老浏览器):用 lodash.cloneDeep
生产环境最稳妥的选择。Lodash 的 cloneDeep 经过大量边界测试,支持:
- function、RegExp、Date、Map、Set、TypedArray、Error、Promise
- 循环引用自动识别与重建
- 保留原型链上的可枚举属性(部分版本支持)
安装后使用:
import cloneDeep from 'lodash/cloneDeep';const copy = cloneDeep(obj);
手写递归深拷贝(仅限学习或极简需求)
可用于理解原理,但实际项目中不建议直接用——容易漏掉 Date、RegExp、Map/Set、循环引用等关键逻辑。
基础版(无循环引用防护):
function deepCopy(obj) {if (obj === null || typeof obj !== 'object') return obj;
const copy = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
进阶版需加入 WeakMap 缓存已拷贝对象来处理循环引用,并单独判断 Date、RegExp、Map、Set 等类型构造新实例。


















