• 深拷贝的原理


    
    

    1.先进行 类型判断 

     if(obj==null)   return obj;
       if(obj  instanceof RegExp)    return  new  RegExp(obj);
       if(obj instanceof Date)       return  new  Date(obj);
       //...
       if(typeof obj !== 'object')    return  obj;

    2. 判断是 数组还是 对象 

     let  instance  = new  obj.constructor;

    demo 

    function deepClone(obj,hash=new WeakMap()) {
       if(obj==null)   return obj;
       if(obj  instanceof RegExp)    return  new  RegExp(obj);
       if(obj instanceof Date)       return  new  Date(obj);
       //...
       if(typeof obj !== 'object')    return  obj;
    
       let  instance  = new  obj.constructor;
    
    //    if(hash.has(obj))   return hash.get(obj);
    //    hash.set(obj,instance);
    //    for (const key in obj) {
    //        if (obj.hasOwnProperty(key)) {
    //            instance[key] =deepClone(obj[key],hash);
    //        }
    //    }
       return  instance;
      }
    console.log(deepClone({a:1,b:2,c:{c:1}}));
    console.log(deepClone([1,2,3,4]));

    输出 :

    {}
    []
     
    3. 遍历数组或者数组   利用   for ..... in  
     
    4.  进行拷贝
       for (const key in obj) {
           if (obj.hasOwnProperty(key)) {
               instance[key] =deepClone(obj[key],hash);
           }
       }

    5.  

     if(hash.has(obj))   return hash.get(obj);
       hash.set(obj,instance);

    这里是先判断 是否有被拷贝了 如果被拷贝了 就返回 它

    设置映射 

     
     
    完整demo  :
     
    function deepClone(obj,hash=new WeakMap()) {
       if(obj==null)   return obj;
       if(obj  instanceof RegExp)    return  new  RegExp(obj);
       if(obj instanceof Date)       return  new  Date(obj);
       //...
       if(typeof obj !== 'object')    return  obj;
    
       let  instance  = new  obj.constructor;
    
       if(hash.has(obj))   return hash.get(obj);
       hash.set(obj,instance);
       for (const key in obj) {
           if (obj.hasOwnProperty(key)) {
               instance[key] =deepClone(obj[key],hash);
           }
       }
       return  instance;
      }
    console.log(deepClone({a:1,b:2,c:{c:1}}));
    console.log(deepClone([1,2,3,4]));

    输出 :

    { a: 1, b: 2, c: { c: 1 } }
    [ 1, 2, 3, 4 ]
  • 相关阅读:
    iOS 检测版本更新(02)
    iOS开发之检查更新
    Core Location :⽤用于地理定位
    TCP与UDP区别
    iOS设计模式之观察者模式
    联系人案例
    ksoap调用webservice
    Android获取内置sdcard跟外置sdcard路径
    百度sdk定位不成功,关闭定位
    PinnedHeaderListView实现删除
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/11328261.html
Copyright © 2020-2023  润新知