js中的深克隆與淺克隆


淺克隆:原始類型按值傳遞,對象類型按引用傳遞,與原對象共用一處內存,修改會使原對象也修改

 1 var lilei={
 2     sname:"li lei",
 3     sage:12,
 4     address:{
 5       city:"xian",
 6       street:"未央區"
 7     }
 8   }
 9   function clone(oldObj){
10     if(oldObj==null){return null};
11     if(typeof oldObj!=="Object"){return oldObj}
12     var newObj = Array.isArray(oldObj)?[]:{};
13     for(var key in oldObj){
14       newObj[key] = oldObj[key]
15     }
16     return newObj;
17   }
18   var lilei2 = clone(lilei);
19   console.log(lilei===lilei2)//true
20   console.log(lilei);
21   console.log(lilei2)
22   lilei2.sname="李雷"
23   console.log(lilei.sname);//李雷
24   lilei2.address.city="beijing";
25   console.log(lilei.address.city);//beijing 很明顯原對象的屬性值已被修改

深克隆:在內存中開辟一塊新內存,將原對象中的所有值全部復制過去,與原對象完全脫離,修改新對象中的屬性值不會影響原對象、

 1 var hmm={
 2     sname:"han meimei",
 3     sage:15,
 4     address:{
 5       city:"shenzhen",
 6       street:"林湖區"
 7     }
 8   }
 9   function clone2(oldObj){
10     var newObj = Array.isArray(oldObj)?[]:{};
11     for(var key in oldObj){
12       if(typeof oldObj[key] !=="object"){
13         newObj[key]=oldObj[key]
14       }else{
15         newObj[key]=clone2(oldObj[key])
16       }
17     }
18     return newObj;
19   }
20   var hmm2=clone2(hmm);
21   console.log(hmm,hmm2);
22   console.log(hmm===hmm2);//false 
23   hmm2.sname="韓梅梅"
24   hmm2.address.city="xian";
25   console.log(hmm.sname);//還是han meimei 原對象沒變
26   console.log(hmm.address.city);//還是shenzhen 原對象沒變


免責聲明!

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



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