深拷贝实现

一、是什么

深拷贝:复制对象所有层级数据,不共享引用。

二、为什么

避免修改副作用:

const a = { x: { y: 1 } };
const b = a;

b.x.y = 2; // a 也变了

三、实现方式

  1. JSON 方式

    JSON.parse(JSON.stringify(obj));
    

    缺点:

    • 丢失函数
    • 不能处理 undefined / Symbol
  2. 递归实现

function deepClone(obj, map = new WeakMap()) {
  if (typeof obj !== 'object' || obj === null) return obj;

  if (map.get(obj)) return map.get(obj);

  const clone = Array.isArray(obj) ? [] : {};
  map.set(obj, clone);

  for (let key in obj) {
    clone[key] = deepClone(obj[key], map);
  }

  return clone;
}

四、总结

  • 推荐使用递归 + WeakMap
  • 生产环境建议用 lodash.cloneDeep