JavaScript深度拷贝核心是递归复制所有嵌套层级值以避免引用共享;常用方案包括JSON.parse+JSON.stringify(简洁但局限多)、structuredClone(现代标准,支持丰富类型但不兼容旧环境)、手写递归(兼容性强可定制)、Lodash cloneDeep(生产推荐,覆盖全面)。
JavaScript 深度拷贝对象,核心是**递归复制所有嵌套层级的值**,避免引用共享。原生没有直接支持深拷贝的 API(Object.assign 和展开运算符都只是浅拷贝),所以需要手动实现或借助可靠方案。
适用于纯数据对象:只含字符串、数字、布尔、null、数组、普通对象,且不含函数、undefined、Symbol、Date、RegExp、Map、Set、循环引用等。
示例:const deepCopy = obj => JSON.parse(JSON.stringify(obj));
Chrome 98+、Firefox 94+、Node.js 17.0+ 支持,是目前最接近“标准深拷贝”的原生方案。
示例:const copy = structuredClone(originalObj)
;
适合需要完全可控、兼容老环境(如 IE)、或需定制行为(如忽略某些字段、处理特殊类型)的场景。
Object.prototype.toString.call 或 typeof + Array.isArray)简化版示意(不含循环引用处理):
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
const clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
经大量测试、覆盖边缘情况(如循环引用、特殊对象、不可枚举属性),API 稳定,适合工程化项目。
npm install lodash,然后 import { cloneDeep } from 'lodash';
const copy = cloneDeep(originalObj);
klona、fast-deep-equal 的配套工具)基本上就这些。选哪种取决于你的运行环境、数据复杂度和是否允许第三方依赖。