淺克隆:原始類型按值傳遞,對象類型按引用傳遞,與原對象共用一處內存,修改會使原對象也修改
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 原對象沒變