衆所周知,對象是一種引用類型
對象的地址指針存放於棧中,而對象實際的數據存放於堆中。
因此當我們簡單地執行復制操作時,實際是把地址指針進行了複製操作,因此在對象的實際數據改變之後,新舊對象都會受到影響。
那麼如何不受到影響呢?
此謂深度克隆
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;
}
判定要克隆的對象是不是引用類型,如果是引用類型,則繼續迭代,如果該項是基本類型,則直接複製。