js 深克隆實現

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