標籤:
js有兩種資料類型:
基本類型(包括undefined,Null,boolean,String,Number),按值傳遞;
參考型別(包括Array,Object),按址傳遞,參考型別在值傳遞的時候是記憶體中的地址。
複製或者拷貝分為2種:
淺度複製:基本類型為值傳遞,對象仍為引用傳遞。
1 var oPerson={ 2 oName:"rookiebob", 3 oAge:"18", 4 oAddress:{ 5 province:"beijing" 6 }, 7 ofavorite:[ 8 "swimming", 9 {reading:"history book"}10 ],11 skill:function(){12 console.log("bob is coding");13 }14 };15 function clone(obj){16 var result={};17 for(key in obj){18 result[key]=obj[key];19 }20 return result;21 }22 var oNew=clone(oPerson);23 console.log(oPerson.oAddress.province);//beijing24 oNew.oAddress.province="shanghai";25 console.log(oPerson.oAddress.province);//shanghai
深度複製:所有元素或屬性均完全複製,並於原參考型別完全獨立。即,在後面修改對象的屬性的時候,原對象不會被修改。
1 function deepClone(obj){ 2 var result,oClass=isClass(obj); 3 //確定result的類型 4 if(oClass==="Object"){ 5 result={}; 6 }else if(oClass==="Array"){ 7 result=[]; 8 }else{ 9 return obj;//此處如果用return result=obj;會大幅增加時間複雜度10 }11 for(key in obj){12 var copy=obj[key];13 if(isClass(copy)=="Object"){14 result[key]=arguments.callee(copy);//遞迴調用15 }else if(isClass(copy)=="Array"){16 result[key]=arguments.callee(copy);17 }else{18 result[key]=obj[key];19 }20 }21 return result;22 }23 //返回傳遞給他的任意對象的類24 function isClass(o){25 if(o===null) return "Null";26 if(o===undefined) return "Undefined";27 return Object.prototype.toString.call(o).slice(8,-1);//返回"[object type]"數組故需從數組第8個元素到最後一個元素截取“type”部分內容28 }29 var oPerson={30 oName:"rookiebob",31 oAge:"18",32 oAddress:{33 province:"beijing"34 }, 35 ofavorite:[36 "swimming",37 {reading:"history book"}38 ],39 skill:function(){40 console.log("bob is coding");41 }42 };43 //深度複製一個對象44 var oNew=deepClone(oPerson);45 46 oNew.ofavorite[1].reading="picture";47 console.log(oNew.ofavorite[1].reading);//picture48 console.log(oPerson.ofavorite[1].reading);//history book49 50 oNew.oAddress.province="shanghai";51 console.log(oPerson.oAddress.province);//beijing52 console.log(oNew.oAddress.province);//shanghai
javascript深度複製