javascript中复制引用类型需深拷贝:json.parse(json.stringify())适用于纯数据对象;structuredclone()是现代浏览器首选,支持map/set/循环引用;lodash的clonedeep()兼容性最好;手动实现仅适合学习。

JavaScript 中复制引用数据类型(如对象、数组、Map、Set 等)时,直接赋值只会复制引用(即内存地址),导致新旧变量指向同一块堆内存——修改任一变量会影响另一个。要真正“复制一份独立副本”,需进行深拷贝(deep copy),而非浅拷贝(shallow copy)。
浅拷贝只复制第一层,嵌套对象仍共享地址
像 Object.assign()、展开运算符 {...obj} 或 [...arr] 都属于浅拷贝:
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { ...obj1 };
obj2.a = 99; // ✅ 不影响 obj1.a
obj2.b.c = 99; // ❌ obj1.b.c 也变成 99(b 仍是同一引用)
这类方法仅对最外层属性做“值复制”,而内部嵌套的引用类型仍共用地址。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
推荐的深拷贝方式(兼顾兼容性与可靠性)
-
JSON 序列化反序列化(简单场景可用):
适用纯数据对象(无函数、undefined、Symbol、Date、RegExp、Map/Set、循环引用):const copy = JSON.parse(JSON.stringify(original)); -
structuredClone()(现代浏览器首选):
原生支持深拷贝,能处理 Date、RegExp、Map、Set、ArrayBuffer 及嵌套结构,且支持循环引用(部分环境):const copy = structuredClone(original);
✅ 兼容 Chrome 98+、Firefox 94+、Edge 98+;Safari 15.4+(需开启实验特性) -
Lodash 的 cloneDeep():
成熟稳定,兼容所有 JS 类型和循环引用,适合需要广泛兼容性的项目:import { cloneDeep } from 'lodash-es';<br>const copy = cloneDeep(original);
手动实现简易深拷贝(理解原理,不建议生产使用)
适用于学习或极简需求,但无法处理函数、特殊对象、循环引用等:
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepCopy(item));
if (obj instanceof Object) {
const copy = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
return obj;
}
特别注意:哪些情况深拷贝会失效或需额外处理
- 函数、undefined、Symbol 属性:JSON 方法会丢失;structuredClone 会抛错或忽略(取决于环境)
- 循环引用:JSON 报错;structuredClone 在支持版本中可处理;Lodash 自动检测并正确克隆
- 特殊对象(Promise、Error、HTMLElement):多数深拷贝方法不支持,需按需定制逻辑
- 性能敏感场景:大对象深拷贝开销明显,考虑是否真需要完整拷贝,或改用不可变更新(如 Immer)
选对方法比“怎么写”更重要:日常开发优先用 structuredClone;需兼容老环境就上 Lodash;纯 JSON 数据且无边缘值,可用 JSON 方案。避免手写深拷贝处理复杂类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










