使用深度优先遍历,写一个功能完备的js深拷贝函数,防止循环引用
function deepClone(obj, hash = new WeakMap()) { if (Object(obj) !== obj) return obj; // 基本数据类型直接返回 if (hash.has(obj)) return hash.get(obj); // 防止循环引用 let cloneObj; const Constructor = obj.constructor; switch (Constructor) { case RegExp: cloneObj = new Constructor(obj); break; case Date: cloneObj = new Constructor(obj.getTime()); break; default: cloneObj = new Constructor(); } hash.set(obj, cloneObj); // 缓存已经克隆的对象 for (let key in obj) { if (obj.hasOwnProperty(key)) { cloneObj[key] = deepClone(obj[key], hash); // 递归克隆属性值 } } return cloneObj; }
// 使用示例 const obj = { a: 1, b: { c: 2, d: { e: 3, f: { g: 4, h: null } } } }; obj.b.d.f.h = obj.b.d; // 循环引用 const cloneObj = deepClone(obj); console.log(cloneObj.b.d.f.h === cloneObj.b.d); // true,说明已经成功克隆了循环引用的对象
原文地址: https://www.cveoy.top/t/topic/zh6 著作权归作者所有。请勿转载和采集!