深拷贝的实现

手写一个简单的深拷贝

利用weakmap的弱引用来解决深拷贝对象中循环引用的问题

const deepClone = (list,map = new WeakMap())=>{
//判断传进来的list是否为引用类型数据
    if(typeof list === 'object'){
    //通过list的constructor来指定cloneList的类型
      const cloneList = new list.constructor
      //如果是Date,RegExp类型直接返回
      if(list instanceof Date) return new Date(list)
      if(list instanceof RegExp) return new RegExp(list)
      //如果传进来的list已经存在于map中直接返回对应的value
      if(map.has(list)){
        return map.get(list)
      }
      //保存每个list key
      map.set(list,cloneList)
      for (const key in list) {
      //不循环原型上的key
        if (Object.hasOwnProperty.call(list, key)) {
        //每个key值等于deepClone的函数返回值,把新的map作为参数传递
          cloneList[key] = deepClone(list[key],map)
        }
      }
      return cloneList
    }else{
    //值类型直接返回
      return list
    }
   }

简单实现了深拷贝,如果没有时间,正则类型的数据平常都使用JSON.parse(JSON.stringify(Object))进行深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值