深拷贝要求递归复制对象的所有层级,使副本与原对象完全独立。常见方案:
structuredClone(obj):现代浏览器与 Node 17+ 原生支持,能处理循环引用、Map、Set、Date、ArrayBuffer 等,但不能拷贝函数和 DOM 节点;JSON.parse(JSON.stringify(obj)):简单但缺陷多——丢失undefined、函数、Symbol,Date变字符串,无法处理循环引用,NaN/Infinity变null;- 手写递归:核心是遍历对象属性逐个复制,用
WeakMap记录已拷贝对象以处理循环引用。
function deepClone(obj, map = new WeakMap()) {
if (obj === null || typeof obj !== 'object') return obj;
if (map.has(obj)) return map.get(obj); // 循环引用
const copy = Array.isArray(obj) ? [] : {};
map.set(obj, copy);
for (const key of Reflect.ownKeys(obj)) {
copy[key] = deepClone(obj[key], map);
}
return copy;
}
注意点:特殊对象(Date、RegExp、Map、Set)需单独处理;Symbol 键要用 Reflect.ownKeys 才能覆盖;原型链是否保留视需求而定。追问:浅拷贝方案(展开运算符、Object.assign)与深拷贝的边界场景。