深拷贝如何解决循环嵌套问题 js

在 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值