关于深拷贝的一些思考
问题:写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
浙公网安备 33010602011771号