在 JavaScript 中,处理循环嵌套结构的深拷贝时,需要注意解决循环引用导致的无限递归问题。以下是一种常见的深拷贝方法来处理循环嵌套结构:
function deepCopy(obj, cache = new WeakMap()) {
// 如果 obj 是原始类型或 null,则直接返回
if (typeof obj !== 'object' || obj === null) {
return obj;
}
// 检查缓存,避免循环引用导致的无限递归拷贝
if (cache.has(obj)) {
return cache.get(obj);
}
// 创建一个新的目标对象(数组或对象)
const clone = Array.isArray(obj) ? [] : {};
// 将新创建的目标对象添加到缓存中
cache.set(obj, clone);
// 遍历 obj 的所有属性并进行深拷贝
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
clone[key] = deepCopy(obj[key], cache);
}
}
return clone;
}
上述代码中使用了 WeakMap 来作为缓存,以避免循环引用导致的无限递归。WeakMap 可以存储对象键和值之间的关联关系,并且不会阻止对象被垃圾回收。
const obj = {
name: 'Alice',
age: 25,
};
obj.friends = [obj]; // 添加一个循环引用
const clonedObj = deepCopy(obj);