JS基本:淺拷貝和深拷貝

 /*
  * 基本類型保存在棧內存,引用類型保存在堆內存,堆比棧大(適合存放大數據),棧比堆速度快(適合查找)
  *
  * 基本類型:undefined null Number String Boolean
  * 引用類型:Object
  *
  * 基本類型賦值:a=3;b=a;b=4;console.log(a,b)  //3,4
  * 引用類型賦值:在賦值時,只是將數據的地址賦給一個變量,沒有把數據也給它,當改變這個數據時,引用地址的變量的值都會改變
  *  var a={   //a指向一個數據的地址
      name:'zzz'
       };
      var b=a;   //將這個地址賦值給b
     b.name='sss'  //b修改數據,a和b共享數據,於是a的數據也發生改變
     console.log(b.name);  //sss
     console.log(a.name);   //sss

     a={   //a重新指向一個地址  此時b指向的地址依舊是name:sss
       name='zsm'
     }
     console.log(b.name)    //sss
     console.log(a.name)    //zsm
  * */

/*
* 淺拷貝:只拷貝對象的第一層屬性,基本數據類型爲拷貝,引用類型爲引用地址,那麼就不會發生拷貝而是會發生引用例如{name:{...}}則name'仍舊是引用
*        在一個爲引用類型(Object)的變量:這個變量是一個對象時,將這個a變量賦值給另一個b變量,b改變值,a也會改變
*

   //淺拷貝的實現
    function copyClone(obj) {
    var newobj={}  //創建一個對象
    for(var i in obj){
        newobj[i]=obj[i]   //迭代舊對象,將舊對象的值傳給新對象
    };
    return newobj
   };
     var obj={
    name:111
   };
  var obj2=copyClone(obj);
   obj2.name='zz';
  console.log(obj);  //name:111
  console.log(obj2);    //name:'zz'

   實現淺拷貝的方法:建立一個新的對象,循環遍歷傳入的參數對象,將該對象的值push進新的對象

function copyClone(obj) {
    var newobj={}
    for(var i in obj){
        newobj[i]=obj[i]
    };
    return newobj
};
var obj={
    name:111,
    data:{
        type:'get'
    }
};
var obj2=copyClone(obj);
  obj2.name='zz';
  obj.data.type='post';
console.log(obj);  //111 post
console.log(obj2);   //zz  post


  深拷貝:和淺拷貝不同,它是將數據賦給一個變量,而不只是將數據的地址賦給變量
  1、使用json   var obj2=JSON.parse(JSON.stringify(obj2));----壞處:拋棄原來的constructor,對象只能是能被JSON識別的數據
  2、使用assign  var obj2=Object.assign({},obj1),如此一來obj2的修改完全影響不到obj1了,但是注意這裏的obj1只能是一個簡單對象,如{name:...}不能是一個複雜對象:{name:{....}}
  3、使用create
* */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章