关于深拷贝的一些思考

问题:写ECharts 图表多层嵌套的 options 配置的时候,直接传递引用,子组件内部的修改会直接“污染”父组件的默认配置

解决方案1:为了小装一手,自己搓一个深拷贝工具函数,可以解决我自己项目的问题,

function deepClone(target, map = new WeakMap()) {
  // 基础类型 / null undefined
  if (target === null || typeof target !== 'object') return target;

  // 循环引用解决
  if (map.has(target)) return map.get(target);

  // 特殊对象处理
  if (target instanceof Date) return new Date(target);
  if (target instanceof RegExp) return new RegExp(target.source, target.flags);
  if (target instanceof Map) {
    const newMap = new Map();
    map.set(target, newMap);
    target.forEach((v, k) => newMap.set(deepClone(k, map), deepClone(v, map)));
    return newMap;
  }
  if (target instanceof Set) {
    const newSet = new Set();
    map.set(target, newSet);
    target.forEach(v => newSet.add(deepClone(v, map)));
    return newSet;
  }

  // 数组 / 对象
  const cloneTarget = Array.isArray(target) ? [] : {};
  map.set(target, cloneTarget);

  Reflect.ownKeys(target).forEach(key => {
    cloneTarget[key] = deepClone(target[key], map);
  });

  return cloneTarget;
}

解决方案2: Lodash 的 _.cloneDeep()

哥们你是来解决问题的啊!!!你不是来秀操作的
那你为什么不用 Lodash 的 _.cloneDeep()呢,我直呼666

 

posted on 2026-07-11 19:49  中文还在写码  阅读(8)  评论(0)    收藏  举报