深度克隆递归

本文介绍了如何使用递归实现深度克隆,首先解释了目标变量`target`的声明和作用,然后利用`Object.prototype.toString`方法来判断对象类型,区分基本数据类型和引用数据类型。针对引用数据类型,分别处理数组和对象,通过递归调用自身实现层级复制。当所有数据均为基本数据类型时,递归结束,最终得到完整的克隆对象。
摘要由CSDN通过智能技术生成
function deepClone(origin,target){
var target=target || {}; //防止target为空
  var toString=Object.prototype.toString,
      arrClass='[object Array]',
      objectClass='[object Object]';
  for(var prop in origin){
      // 判断是否为基本数据类型
      // 判断传入的对象属性的属性值是否为object,并且不能为null
      if(typeof(origin[prop])=='object'&&origin[prop]!==null){
          // 引用类型
          // 判断是数组还是对象
          if(toString.call(origin[prop])==arrClass){
              target[prop]=[];
          }else if(toString.call(origin[prop])==objectClass){
              target[prop]=={};
          }
          // 只考虑数组和对象的引用类型
          // target[prop]=toString.call(origin[prop])==arrClass? []:{};
          // 递归,循环取出对象或者数组中的元素,知道都是基本数据类型
          deepClone(origin[prop],target[prop]);
      }else{
          // 判断是基本数据类型
          target[prop]=origin[prop];
      }
  }
  return target;
}

参数1为被克隆的对象,参数2为克隆对象target
var target=target || {};这句的意思是,声明一个变量名为target的变量,值为实参target || { },当我们没有传入参数的时候,第二实参值为undefinde,在进行表达式运算的时候,转为boolean为false,target最后的值为{}一个空对象。
Object.prototype.toString提取获得最初对象类型字符串的方法,后面会用,arrClass和objectClass都是为后面做判断使用的字符串。
遍历被克隆对象origin,首先判断当前项是基本数据类型还是引用数据类型,如果是基本数据类型,函数通过else向下执行,如果不是基本数据类型,那么就进入if判断中,引用数据类型的大块是数组和对象,这里我们判断引用数据类型是数组引用数据类型还是对象引用数据类型,Object.prototype.toString.call(引用数据类型)如果结果为’[[object Array]]'即为对象,如果结果为‘[object Object]’即为对象,判断完成后创建相对于的空数组或空对象,下一步调用函数本身,参数1写入当前引用类型项,参数2写入创建的空数组或者是空对象,这样一层一层的向下,直到最下层都是基本数据类型为止,返回得到的target,一层一层向上返回,最后得到克隆的效果,这个递归的出口为最下层所有数据都为基本数据类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值