JS對象深度克隆


首先看一個例子:

1 var student = {
2     name:"yxz",
3     age:25
4 }
5 var newStudent = student;
6 newStudent.sex = "male";
7 console.log(student); //{name:"yxz",age:25,sex:"male"}

    由此可見,將一個對象通過簡單的傳遞賦值傳遞給一個新的變量時,僅僅是給該對象增添了一個別名。所以,對該別名的操作也會作用到原對象上去,所以通過newStudent.sex給對象student添加屬性可以實現。然而,更多的時候我們希望newStudent和student對象是獨立的,那么就需要生成一個原對象的副本,請看下面的例子:

 1 var cloneObj = function(obj){
 2     var str, newobj = obj.constructor === Array ? [] : {};
 3     if(typeof obj !== 'object'){
 4         return;
 5 } else if(window.JSON){ 6 str = JSON.stringify(obj), //序列化對象 7 newobj = JSON.parse(str); //還原 8 } else { 9 for(var i in obj){ 10 newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]; 11 } 12 } 13     return newobj;
14 };
15 //測試
16 var student = {
17     name:"yxz",
18     age:25,
19     sex:"male"
20 };
21 //執行深度克隆
22 var newStudent = cloneObj(student);
23 delete newStudent.sex;
24 console.log(newStudent); //{name:"yxz",age:25}
25 console.log(student); //{name:"yxz",age:25,sex:"male"}

通過執行結果可以看出newStudent已經成為了一個克隆出來的副本,對newStudent的任何操作將不再影響student對象。

備注:JSON.stringify和parse分別為JSON對象的序列化和反序列化函數,即分別負責將對象序列化成字符串和將json字符串反序列化成對象,因為這個是屬於ECMAScript5規范,所以上面程序紅色部分做了一個兼容處理。


免責聲明!

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



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