//整体想法 对基础类型 函数类型 引用类型分情况处理,用weakMap处理循环引用的情况
const deepClone = (obj, distObj = {}, weakMap = new WeakMap()) => {
if (!obj || typeof obj !== "object") {
return distObj;
}
if (!weakMap.has(obj)) {
weakMap.set(obj, distObj);
}
Object.keys(obj).forEach((key) => {
const keyValue = obj[key];
//函数的情况
if (typeof keyValue === "function") {
distObj[key] = keyValue;
//对象情况
} else if (keyValue && typeof keyValue === "object") {
//说明还没有发生循环引用
if (!weakMap.has(keyValue)) {
//复制引用对象
const dt = { ...keyValue };
distObj[key] = dt;
//把值存入weakMap
weakMap.set(keyValue, dt);
deepClone(dt, dt, weakMap);
} else {
//说明发生了循环引用
distObj[key] = weakMap.get(keyValue);
}
} else {
//基础类型情况
distObj[key] = keyValue;
}
});
return distObj;
};
//测试用例 构造循环引用
const ddd = { aa: 44, c: 3, fun: () => 0 };
const ttt = { d: 4, g: { d: ddd } };
ddd.t = ttt;
console.log("克隆结果", deepClone(ttt));
网友评论