深拷贝需创建完全独立副本,避免引用干扰;JSON法简洁但丢函数/循环引用;structuredClone是现代推荐方案;手写递归可定制且兼容旧环境;Lodash cloneDeep最健壮但体积大。
JavaScript中深拷贝的核心是创建一个全新对象,使其与原对象完全独立,修改副本不会影响原始数据。直接赋值或浅拷贝(如Object.assign()、展开运算符{...obj})只复制引用,导致修改嵌套属性时互相干扰。
这是最简方式,适合纯数据对象(不含函数、undefined、Symbol、Date、RegExp、Map、Set、循环引用等):
const deepCopy = JSON.parse(JSON.stringify(originalObj));ES2025引入的原生API,支持大多数内置类型(包括Map、Set、Date、RegExp、ArrayBuffer等),且能处理循环引用:
const deepCopy = structuredClone(originalObj);--experimental-structured-cloning标志;18.11+默认启用适用于需要兼容IE或控制拷贝行为(如忽略某些字段、处理特殊类型)的场景:
Object.prototype.toString.call(val)区分普通对象、数组、Date、RegExp等
const copy = Array.isArray(obj) ? [] : {};Lodash的_.cloneDeep()经过大量边界测试,支持几乎所有JS类型和循环引用,适合生产环境快速落地:
import { cloneDeep } from 'lodash-es';
const deepCopy = cloneDeep(originalObj);lodash-es或CDN按需加载