//例子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中,我們要取得的值,其實(shí)是通過(guò)對(duì)象指向的引用地址波闹,在堆內(nèi)存中對(duì)應(yīng)的值轻黑。
在例子1中 a=30帚屉;在變量對(duì)象中的數(shù)據(jù)發(fā)生復(fù)制行為時(shí)寺渗,系統(tǒng)會(huì)自動(dòng)為新的變量分配一個(gè)新值。var b =a執(zhí)行之后击奶,a與b雖然值都等于20拍谐,但是他們其實(shí)已經(jīng)是相互獨(dú)立互不影響的值了.
在例子2 中 我們通過(guò)var b = a執(zhí)行一次復(fù)制引用類(lèi)型的操作烛缔。引用類(lèi)型的復(fù)制同樣也會(huì)為新的變量自動(dòng)分配一個(gè)新的值保存在變量對(duì)象中,但不同的是轩拨,這個(gè)新的值践瓷,僅僅只是引用類(lèi)型的一個(gè)地址指針。當(dāng)?shù)刂分羔樝嗤瑫r(shí)亡蓉,盡管他們相互獨(dú)立晕翠,但是在變量對(duì)象中訪問(wèn)到的具體對(duì)象實(shí)際上是同一個(gè).
例子2就屬于淺拷貝,所謂淺拷貝就是復(fù)制了對(duì)象的指針地址砍濒,當(dāng)有一方改變時(shí)淋肾,另一方也會(huì)發(fā)生改變硫麻。
深拷貝就是把這個(gè)對(duì)象的所有屬性都拷貝出去,但是會(huì)指向不同的指針地址樊卓。兩個(gè)已經(jīng)是相互獨(dú)立的個(gè)體庶香,不會(huì)發(fā)生改變。
對(duì)象和數(shù)組的深拷貝方法简识。
1.數(shù)組
var a = [12,22];
var b = a;
b[0] = 'hello';
console.log(a,b)//['hello',22],['hello',22]
顯然上面這種情況不是我們想要的,b數(shù)組的改變不能影響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]
對(duì)象的深拷貝
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}