深拷贝是什么
深拷贝(deep copy)是指在复制一个对象时,不仅复制对象本身的值或引用。

与浅拷贝(shallow copy)不同,浅拷贝仅复制对象的第一层属性。
对于嵌套的可变引用仍指向原始对象的子对象,而深拷贝确保原对象与新对象在结构上互不影响,修改其一不会导致另一个的状态改变。
深拷贝有什么价值
深拷贝的主要作用包括:

第一,避免共享可变数据带来的副作用与隐蔽错误,尤其在并发、异步或模块化程序中保障数据隔离性;
第二,便于实现对象的安全快照、撤销/重做、序列化与持久化操作;
第三,支持独立复制复杂数据结构(如树、图、嵌套数组或字典),以便在不同上下文中安全使用。
深拷贝实现原理
不同语言写法不同,但底层理念高度相似,关键有两点:开辟新内存 + 递归复制引用对象。
递归/遍历对象图:
function deepCopy(obj, visited = new WeakMap()) {
// 处理基本类型和 null
if (obj === null || typeof obj !== 'object') return obj;
// 处理循环引用:如果已经拷贝过,直接返回之前的结果
if (visited.has(obj)) return visited.get(obj);
// 处理特殊对象
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags);
if (obj instanceof Map) {
const copy = new Map();
visited.set(obj, copy);
obj.forEach((value, key) => copy.set(key, deepCopy(value, visited)));
return copy;
}
if (obj instanceof Set) {
const copy = new Set();
visited.set(obj, copy);
obj.forEach(value => copy.add(deepCopy(value, visited)));
return copy;
}
// 处理数组和普通对象
const copy = Array.isArray(obj) ? [] : {};
visited.set(obj, copy);
// 递归拷贝可枚举属性(包括 Symbol)
Reflect.ownKeys(obj).forEach(key => {
copy[key] = deepCopy(obj[key], visited);
});
return copy;
}
从源对象开始,依次访问每个字段:基本类型直接拷贝数值。
引用类型则继续创建新对象并复制其内部字段,如此递归直到最底层的基本类型。
这样构建出一棵与原对象结构相同、但全部节点都是新内存的对象树。
mikechen睿哥
10年+一线大厂架构实战经验,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。