javascript深拷贝需递归复制所有层级属性以避免引用共享;原生方法如object.assign()仅浅拷贝;json.parse(json.stringify())简洁但限制多;手写递归可定制性强;structuredclone()现代且支持广但兼容性有限;lodash的_.clonedeep()最全面稳定。

JavaScript 中实现对象的深拷贝,核心是**递归复制所有层级的属性值,避免引用共享**。原生方法如 Object.assign() 或展开运算符({...obj})只能浅拷贝,对嵌套对象、数组、日期、正则等类型无效。
使用 JSON.parse(JSON.stringify())(简单场景适用)
这是最简洁的方式,适合纯数据对象(只含字符串、数字、布尔、null、数组、普通对象),不支持函数、undefined、Symbol、Date、RegExp、Map、Set、循环引用等。
- ✅ 优点:一行代码,无依赖,兼容性好
- ❌ 缺点:丢失函数、undefined、Date 变成字符串、NaN 变成 null、无法处理循环引用、会忽略原型链和不可枚举属性
示例:
const obj = { a: 1, b: { c: 2 } };const copy = JSON.parse(JSON.stringify(obj));
手写递归深拷贝(可控性强,推荐理解原理)
通过递归判断数据类型,分别处理对象、数组、Date、RegExp 等,能保留更多类型信息,也便于扩展(如处理循环引用)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
typeof和Object.prototype.toString.call()准确识别类型 - 用 WeakMap 记录已拷贝的对象,解决循环引用问题
- 对 Date、RegExp、Array、Object 等分别 new 实例并赋值
简化版示例(不含循环引用处理):
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 cloned = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
使用结构化克隆(现代浏览器 & Node.js 17+)
structuredClone() 是原生支持的深拷贝 API,支持 Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error、Blob、FormData、URL 等,也支持循环引用,但暂不支持函数和 undefined(会抛错)。
- ✅ 无需第三方库,语义清晰,性能较好
- ⚠️ 注意兼容性:Chrome 98+、Firefox 94+、Safari 15.4+;Node.js 17.0+(需启用 --experimental-structured-cloning 标志,18.11+ 默认开启)
示例:
const obj = { date: new Date(), regex: /abc/g };const copy = structuredClone(obj); // ✅ 正确复制 Date 和 RegExp
借助成熟工具库(工程化项目首选)
Lodash 的 _.cloneDeep() 是最稳妥的选择,覆盖几乎所有 JS 类型,经过大量测试,支持循环引用、函数(拷贝为 undefined)、Map/Set/WeakMap/WeakSet、Promise 等,并提供自定义克隆逻辑的能力。
- 安装:
npm install lodash - 使用:
import { cloneDeep } from 'lodash'; const copy = cloneDeep(obj); - 优势:稳定、全面、有维护、可 Tree-shaking(按需引入)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










