• 深拷贝的原理


    
    

    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 ]
  • 相关阅读:
    win10自带输入法突然变成了繁体
    Eclipse 包视图折叠
    Unknown column '字段名' in 'field list' 错误解决方案
    The method getContextPath() from the type HttpServletRequest
    Eclipse 设置新建文件默认编码为 utf-8 的方法
    Java 混淆器
    程序员,不能缺少的几张图
    北漂程序员,扬帆起航的地方
    数据是啥?数据都去哪儿了?
    7行代码搞定WEB服务
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/11328261.html
Copyright © 2020-2023  润新知