• 深拷贝的原理


    
    

    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 ]
  • 相关阅读:
    关于如何正确地在android项目中添加第三方jar包
    如何在asp.net页面使用css和js
    Prolog 外部不能有 DOCTYPE 声明。处理资源 'http://192.168.115.152:8082/api/EmpApi.aspx' 时出错。第 3 行,位置: 11
    怎样在iis中发布asp.net网站
    WInform 创建一个简单的WPF应用
    细说WPF数据绑定
    WPF控件模板
    DC画线
    第一部分 Mysql的基础
    链表○⇢习题集
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/11328261.html
Copyright © 2020-2023  润新知