//例子1
var a = 30;
var b = a;
b= 20;
console.log(a,b)//30,20
//例子2
var a = {m:20,n:30};
var b = a;
b.m = 40;
console.log(a,b)//{m:20,n:30},{m:40,n:30}
在JavaScript中,我們要取得的值,其實是通過對象指向的引用地址,在堆內存中對應的值。
在例子1中 a=30;在變量對象中的數據發生復制行為時,系統會自動為新的變量分配一個新值。var b =a執行之后,a與b雖然值都等于20,但是他們其實已經是相互獨立互不影響的值了.
在例子2 中 我們通過var b = a執行一次復制引用類型的操作。引用類型的復制同樣也會為新的變量自動分配一個新的值保存在變量對象中,但不同的是,這個新的值,僅僅只是引用類型的一個地址指針。當地址指針相同時,盡管他們相互獨立,但是在變量對象中訪問到的具體對象實際上是同一個.
例子2就屬于淺拷貝,所謂淺拷貝就是復制了對象的指針地址,當有一方改變時,另一方也會發生改變。
深拷貝就是把這個對象的所有屬性都拷貝出去,但是會指向不同的指針地址。兩個已經是相互獨立的個體,不會發生改變。
對象和數組的深拷貝方法。
1.數組
var a = [12,22];
var b = a;
b[0] = 'hello';
console.log(a,b)//['hello',22],['hello',22]
顯然上面這種情況不是我們想要的,b數組的改變不能影響a;
var a = [12,22];
var b = a.conact();
b[0] = 'hello';
console.log(a,b)//[12,22],['hello',22]
var a = [12,22];
var b = a.slice(0);
b[0] = 'hello';
console.log(a,b)//[12,22],['hello',22]
var a = [12,22];
var [...b] = a;
b[0] = 'hello';
console.log(a,b)//[12,22],['hello',22]
對象的深拷貝
var a ={
? ? m:20,
? ? n:30
}
var b = a ;
b.m ='hello';
console.log(a,b)//{m:'hello',n:30},{m:'hello',n:30}
var a ={
? ? m:20,
? ? n:30
}
var b = Json.parse(Json.stringify(a)) ;
b.m ='hello';
console.log(a,b)//{m:20,n:30},{m:'hello',n:30}
var a ={
? ? m:20,
? ? n:30
}
var {...b}= a;
b.m = 'hello';
console.log(a,b)//{m:20,n:30},{m:'hello',n:30}