常问面试题之深拷贝和浅拷贝,你真的掌握了吗?系列之递归封装深拷贝

94 阅读1分钟

上一节,我们了解了下深拷贝和浅拷贝的概念,只了解于此还不够,如果想要你面试加分,亲手写一个深拷贝的代码还是非常必要的,接下来就让我们看下如何去写。

在这里只做下粗略的封装,如果还有具体的细节没考虑到,可以添加奥!

现在就让我们来分析下:数据类型分为基本数据类型和引用数据类型:

  • 基本数据类型我们在拷贝的时候直接返回那个值即可
  • 引用数据类型,分为object 和function 不过我们拷贝的时候,肯定不会考虑函数,所以这种情况忽略,接下来我们就考虑下对象

对象:

  • 普通的对象
  • 数组
  • 正则
  • Date 日期
  • ...

对于正则和日期,虽然也是对象数据类型,但是我们不需要去遍历,所以需要单独处理下,直接返回实例即可。如果是普通对象的和数组的话,我们就需要遍历下。这里需要考虑下拿到的值是否还是对象,所以此处我们用递归去做。

在此还需要注意的是,在判断是不是对象的时候,我们需要去考虑下null typeof null 的结果也是“object”。

var obj={
    name:"li",
    hobby:{
        reads:"book"
    }
}


function deepClone(obj){
    if(obj===null){
      return null;
    }
    /* 基本数据类型的值(不考虑function) */
    if(typeof obj!="object") {
        return obj;
    }
    if(obj instanceof RegExp){
        return new RegExp(obj);
    }
    if(obj instanceof Date){
        return new Date(obj);
    }
    let  target= new obj.constructor();
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            target[key]=deepClone(obj[key]);
        }
       
    }
    return target;
};

var res=deepClone(obj);
res.hobby.reads="hehe";
console.log(res,obj);



认真仔细的看看,是不是也没那么难,一起加油吧,小伙伴,在成长的道路上,有你我相伴奥!