js解决循环引用的深拷贝
时间: 2023-11-09 12:46:55 浏览: 49
在 JavaScript 中,循环引用是指当一个对象中存在对自身的引用时。处理循环引用时,我们需要使用深拷贝来创建一个对象的副本,以避免出现无限递归的问题。以下是一种可以解决循环引用的深拷贝方法:
```javascript
function deepCopy(obj, cache = new WeakMap()) {
// 如果不是对象类型,则直接返回
if (!(obj instanceof Object)) {
return obj;
}
// 如果已经拷贝过该对象,则直接返回该拷贝对象
if (cache.has(obj)) {
return cache.get(obj);
}
// 根据对象的类型创建一个新的空对象
let clone;
if (obj instanceof Array) {
clone = [];
} else if (obj instanceof Date) {
clone = new Date(obj.getTime());
} else if (obj instanceof RegExp) {
clone = new RegExp(obj);
} else {
clone = {};
}
// 将新创建的对象添加到缓存中
cache.set(obj, clone);
// 遍历原对象的属性,并递归进行深拷贝
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepCopy(obj[key], cache);
}
}
return clone;
}
```
使用该方法,可以深度拷贝包含循环引用的对象,避免出现无限递归的问题。例如:
```javascript
const obj = { foo: 'bar' };
obj.self = obj;
const clone = deepCopy(obj);
console.log(clone); // { foo: 'bar', self: [Circular] }
console.log(clone === obj); // false
```
上述代码中,我们创建了一个对象 `obj`,它包含了一个对自身的引用。使用 `deepCopy` 方法对 `obj` 进行深拷贝后,得到了一个新的对象 `clone`,该对象也包含了对自身的引用。但是由于进行了深拷贝,所以不会出现无限递归的问题。