javascript深度複製

來源:互聯網
上載者:User

標籤:

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深度複製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.