淺談js中的淺拷貝和深拷貝


在js中如何把一個對象里的屬性和方法復制給另一個對象呢?

下面舉一個例子來說明:

var person={name:'chen',age:18};

var son={sex:'男'};

function clone(p,s){

  var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象

  for(var prop in p){

    s[prop]=p[prop];

};

    return s;//返回s對象

};

clone(person,son);

調用clone函數最終返回的結果為 {sex: "男", name: "chen", age: 18}.

但是假如 var person={name:'chen',age:18,man:{hight:188}};即person 對象里包含一個子對象man;

那么在復制時淺拷貝只是將子對象的一個引用地址復制給son對象;son和person里的man 屬性都指向同一個對象,故改變任一個都能影響到另外一個:例子如下:

 

var person={name:'chen',age:18,man:{hight:188}}

var son={sex:'男'};

 

function clone(p,s){

 

  var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象

 

  for(var prop in p){

 

    s[prop]=p[prop];

 

};

 

    return s;//返回s對象

 

};

 

clone(person,son);

son.name='ze';

console.log(son.name);//打印ze

console.log(person.name);//打印chen

son.man.hight=1999;

console.log(son.man.hight);//打印1999

console.log(person.man.hight);//打印1999

深拷貝可以很好的解決引用類型的拷貝問題

采用遞歸的方法去復制拷貝對象,從而解決淺拷貝帶來的弊端

var person={name:'chen',age:18,man:{hight:188}}

var son={sex:'男'};


function clone(p,s){


  var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象


  for(var prop in p){

    if(typeof p[prop]=='object'){

        s[prop]=(p[prop].constructor===Array)?[]:{};//三元運算,將s[prop]初始化為數組或者對象

        clone(p[prop],s[prop])

    }

    else{

      s[prop]=p[prop];
    }
    

};


    return s;//返回s對象


};


clone(person,son);

son.name='ze';

console.log(son.name);//打印ze

console.log(person.name);//打印chen
son.man.hight=1999;

console.log(son.man.hight);//打印1999
console.log(person.man.hight);//打印188

以上內容就是我個人的一些理解,希望能給你帶來收獲!有需要完善的請指出,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM