//整體想法 對基礎類型 函數類型 引用類型分情況處理,用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));
js 深克隆實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.