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/lNhU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录