递归的深拷贝

递归

递归的定义

递归是函数自己调用自己的过程

递归的特点

类似于循环且必须有结束语句

递归深拷贝

因为对象和数组这种引用数据类型它们赋值赋的是地址而不是数值,所以在修改内容时会改变原属性的值

  var oldObj = {
    name: '小明',
    age: 18,
    obj: {
      age: 20
    }
  }
  var newObj = oldObj
  newObj.age = 30
  console.log(newObj);
  console.log(oldObj);

在这里插入图片描述我们在newObject中修改age的值但是oldObject里的age也改变了,这不是我们想要的结果,这种我们称之为浅拷贝。并且一般的深拷贝方法只能遍历一层,当对象里面嵌套对象时就无法实现第二层的深拷贝

而递归的深拷贝则是为了解决这样的问题

  var oldObj = {
    name: '小明',
    age: 18,
    obj: {
      age: 20
    }
  }
  var newObj = {}

  function deepCopy(oldObj, newObj) {
    for (var key in oldObj) {
      if (oldObj[key].constructor == Array) {
        newObj[key] = []
        deepCopy(oldObj[key], newObj[key])
      } else if (oldObj[key].constructor == Object) {
        newObj[key] = {}
        deepCopy(oldObj[key], newObj[key])
      } else {
        newObj[key] = oldObj[key]
      }
    }
  }
  deepCopy(oldObj, newObj)
  newObj.age = 30
  newObj.obj.age = 40
  console.log(oldObj);
  console.log(newObj);

在这里插入图片描述由输出结果我们可以看到,不仅深拷贝实现了并且第二层的age也实现了深拷贝,即newObject的age被修改为了40,而oldObject中的第二层的age依然是20
因为递归的定义便是函数自己调用自己,所以我们创建了一个deepCopy函数,将newObject和oldObject以参数的形式传递进去,通过for... in循环遍历并赋值即可完成深拷贝,重点在于对象里可能嵌套第二层对象甚至更多,所以我们可以使用if判断对象属性的类型,若嵌套的属性依然是引用类型我们只需再次调用deepCopy方法即可,因为deepCopy不就是用来完成深拷贝定义的方法嘛,这样既可完成递归深拷贝。

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值