function deepClone(obj, map = new WeakMap()) {
// 对于不需要递归的类型,直接返回
if (
obj === null ||
typeof obj !== "object" ||
obj instanceof Date ||
obj instanceof RegExp
) {
return obj;
}
// 循环引入
if (map.get(obj)) {
return map.get(obj);
}
if (obj instanceof Map) {
// 对于Map数据结构的处理
const newObj = new Map();
map.set(obj, newObj);
for (let val of obj) {
newObj.set(val[0], deepClone(val[1], map));
}
return newObj;
} else if (obj instanceof Set) {
// 对于Set数据结构的处理
const newObj = new Set();
map.set(obj, newObj);
for (let val of obj) {
newObj.add(deepClone(val, map));
}
return newObj;
} else if (obj instanceof Array) {
// 对于Array数据结构的处理
const newObj = [];
map.set(obj, newObj);
obj.forEach(function (item) {
newObj.push(deepClone(item, map));
});
return newObj;
} else if (obj instanceof Object) {
// 对于Object数据结构的处理
const newObj = {};
map.set(obj, newObj);
for (let key in obj) {
newObj[key] = deepClone(obj[key], map);
}
return newObj;
}
}