深拷贝(手写递归-weakMap)

1、定义一个判断是否为对象的函数

function isObj(val) {
  return typeof val === "object" && val !== null;
}

2、定义deepClone函数,传入obj和一个Hash值,用来记录已经克隆过的对象,避免无线递归

 function deepClone(obj, hash = new weakMap()) {}

3、如果对象已经存在Hash表,则直接返回Hash表中该对象的克隆副本,避免重复克隆

if (hash.has(obj)) {
  return hash.get(obj)
}

4、根据对象的类型创建一个target,如果是数组则创建一个空数组,否则创建一个空对象

 const target = Array.isArray(obj) ? [] : {}

5、将对象与目标对象存入哈希表中,建立对象到目标对象的映射关系

 hash.set(obj, target)

6、遍历对象中所有的可枚举属性,包括自有属性和继承属性,使用Reflect.ownKeys方法获取属性列表。对于每个属性,判断是否为对象类型,如果是对象则递归调用deepClone函数进行深度克隆,否则直接将值复制到目标对象上。

 Reflect.ownKeys(obj).forEach(item => {
    if (isObj(obj[item])) {
      target[item] = deepClone(obj[item], hash)
    } else {
      target[item] = obj[item]
    }
  })
  return target

完整函数

 function isObj(val) {
      return typeof val === 'object' && val !== null
    }
    function deepClone(obj, hash = new weakMap()) {
      if (!isObj(obj)) return obj
      if (hash.has(obj)) {
        return hash.get(obj)
      }
      const target = Array.isArray(obj) ? [] : {}
      hash.set(obj, target)
      Reflect.ownKeys(obj).forEach(item => {
        if (isObj(obj[item])) {
          target[item] = deepClone(obj[item], hash)
        } else {
          target[item] = obj[item]
        }
      })
      return target
    }
# const obj1 = {
#   a: 1,
#   b: { a: 2 }
# };
# const obj2 = deepClone(obj1);
# console.log(obj1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值