深拷贝实现
一、是什么
深拷贝:复制对象所有层级数据,不共享引用。
二、为什么
避免修改副作用:
const a = { x: { y: 1 } };
const b = a;
b.x.y = 2; // a 也变了
三、实现方式
-
JSON 方式
JSON.parse(JSON.stringify(obj));缺点:
- 丢失函数
- 不能处理 undefined / Symbol
-
递归实现
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