深拷贝要求递归复制对象的所有层级,使副本与原对象完全独立。常见方案:

  • structuredClone(obj):现代浏览器与 Node 17+ 原生支持,能处理循环引用、Map、Set、Date、ArrayBuffer 等,但不能拷贝函数和 DOM 节点;
  • JSON.parse(JSON.stringify(obj)):简单但缺陷多——丢失 undefined、函数、SymbolDate 变字符串,无法处理循环引用,NaN/Infinitynull
  • 手写递归:核心是遍历对象属性逐个复制,用 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)与深拷贝的边界场景。