简述深浅拷贝原理

时间:2022-05-19 19:51:28
 //数组浅拷贝
         var arr=["xjz","is","a","superman"];

         //slice
         
         var new_arr=arr.slice();

         new_arr[0]="zxb";

         console.log("before:"+arr);

         console.log("after:"+new_arr);
         


         //concat
         

         var new_arr=arr.concat();

         new_arr[0]="bb";


          console.log("before:"+arr);

          console.log("after:"+new_arr);

//这个方法只能是拷贝基本类型 如果数组项是引用类型的话 只会拷贝引用
//所以当以后改变这个引用的时候 都会发生改变 很麻烦
//只是适用于存储基本类型的数组的拷贝

   //深拷贝
           //如果只是简单地数据类型 可以json解析
         //function undefined null NAN Infinity 拷贝不了

          var json=["xjz","super","man",{
                
                "age":12,
                "name":"xjz"

          },function(){return "dadada"},undefined,null,NaN,Infinity];

         
          var newJSON=JSON.parse(JSON.stringify(json));

 

所以还需要自己写一个拷贝  啊哈哈哈哈哈
 

 //for in 不可以获取不可枚举的属性
 //hasOwnProperty 会忽略原型链上的属性
 //Object.getOwnPropertyNames 可以获取可枚举和不可枚举的属性
 //深拷贝

 

function deepCopy(obj){
                  
             if(!(obj && typeof obj==="object")){

                        return;
                 }

               else{

                  var copyResult = obj instanceof Array ?[]:{};

                     for(var key in obj){
                           
                        if(obj.hasOwnProperty(key)){

                           copyResult[key]=typeof obj[key] ==="object"?deepCopy
                           (obj[key]):obj[key];

                         }

                     }

                }

            return copyResult;

        }


      var obj={

          "data":[{"age":12},{"name":"xjz"}, 

           {"adress":"ChangChun"}],

            callBack:function(){
              
              console.log("my love is zxb");

          }

      };