function deepClone(obj, map = new WeakMap()) {
if (typeof obj!== 'object' || obj === null) {
return obj;
}
if (map.has(obj)) {
return map.get(obj);
}
let clone;
if (Array.isArray(obj)) {
clone = [];
} else {
clone = {};
}
map.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], map);
}
}
return clone;
}
性能优化及原理
- WeakMap 避免循环引用:使用
WeakMap
来存储已经克隆过的对象。在克隆过程中,如果遇到已经处理过的对象(通过 WeakMap
检测),直接返回其克隆结果,避免无限递归。WeakMap
的键是弱引用,不会阻止对象被垃圾回收,相比 Map
更适合用于这种场景,因为不需要手动管理键值对的移除。
- 减少不必要的判断:在函数开始处,先判断
obj
是否为对象或 null
,如果不是,直接返回。这样减少了不必要的后续处理,提高性能。同时在创建克隆对象时,根据 obj
是数组还是对象直接创建相应类型,避免多余的类型转换操作。