JavaScript對象深度克隆的簡單實現

衆所周知,對象是一種引用類型
對象的地址指針存放於棧中,而對象實際的數據存放於堆中。
因此當我們簡單地執行復制操作時,實際是把地址指針進行了複製操作,因此在對象的實際數據改變之後,新舊對象都會受到影響。
那麼如何不受到影響呢?

此謂深度克隆
JS中的深度克隆,指的是原對象改變了,克隆出來的新對象也不會改變,原對象與新對象是完全獨立的關係。
有深度克隆就是
淺度克隆
原始類型爲值傳遞,對象類型仍爲引用傳遞。

(1)原始類型包括:數值、字符串、布爾值、null、undefined
(2)對象類型包括:對象即是屬性的集合,當然這裏又兩個特殊的對象----函數(js中的一等對象)、數組(鍵值的有序集合)。

原始類型複製:

//數值克隆的表現
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//字符串克隆的表現
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"

//布爾值克隆的表現
var x=true;
var y=x;
y=false;
console.log(x);// true
console.log(y);// false

原始類型即使我們採用普通的克隆方式仍能得到正確的結果,原因就是原始類型存儲的是對象的實際數據。
對象類型:
函數式一等對象,當然也是對象類型,但是函數的克隆通過淺克隆即可實現

var m=function(){alert(1);};
var n=m;
n=function(){alert(2);};
 
console.log(m());//1
console.log(n());//2

深度簡單實現:

function deepClone(obj){
var newObj =obj instanceof Array ? [] :{};
for(var item in obj){
var temple=typeof obj[item] =='object' ? deepClone (obj[item]):obj[item];
newObj[item] =temple;
}
return newObj;
}

判定要克隆的對象是不是引用類型,如果是引用類型,則繼續迭代,如果該項是基本類型,則直接複製。

發佈了142 篇原創文章 · 獲贊 42 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章