在使用JavaScript對(duì)數(shù)組進(jìn)行操作的時(shí)候锨阿,我們經(jīng)常需要將數(shù)組進(jìn)行備份,也就是復(fù)制记罚、克隆或者說做拷貝
要弄明白拷貝墅诡,首先要明白js中對(duì)象的組成。在js中一切實(shí)例皆是對(duì)象桐智,具體分為原始類型和合成類型末早。原始類型對(duì)象指的是number、string说庭、boolean等然磷,合成類型對(duì)象指的是array、object以及function刊驴。 數(shù)組的拷貝有深有淺姿搜,下面具體分析!
2.知識(shí)剖析
淺拷貝
淺拷貝可以理解為就是復(fù)制一份來引用捆憎,所有引用對(duì)象都指向一份數(shù)據(jù)舅柜,并且都可以修改這份數(shù)據(jù)。 對(duì)于字符串類型躲惰,淺拷貝是對(duì)值的拷貝致份,對(duì)于對(duì)象來說,淺拷貝是對(duì)對(duì)象地址的拷貝础拨,也就是復(fù)制 的結(jié)果是兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址氮块,修改其中一個(gè)對(duì)象的屬性,則另一個(gè)對(duì)象的屬性也會(huì)改變
var a = ['隔壁老王','冠希哥', '宋經(jīng)理' //定義一個(gè)名為a的屬豬诡宗,里面有3個(gè)值滔蝉,
];
var b = a;? //定義一個(gè)變量b,把a(bǔ)賦值給他塔沃,這樣比蝠引、b和a一樣了
b[2] = '沖沖老師'; //然后把b的第三個(gè)值等于沖沖老師
console.log(a)//那么現(xiàn)在打印a ['隔壁老王','冠希哥', '沖沖老師']
深拷貝
深拷貝則是復(fù)制變量值,對(duì)于非基本類型的變量芳悲,則遞歸至基本類型變量后立肘,再復(fù)制边坤。 深復(fù)制不同于淺復(fù)制名扛,它會(huì)開辟新的內(nèi)存地址,兩個(gè)對(duì)象對(duì)應(yīng)兩個(gè)不同的地址茧痒,修改 一個(gè)對(duì)象的屬性肮韧,不會(huì)改變另一個(gè)對(duì)象的屬性
實(shí)現(xiàn)數(shù)組深拷貝有兩種方法!
方法一: 用js的slice函數(shù)來實(shí)現(xiàn)
方法二:用js的concat方法
3.常見問題
淺拷貝的缺點(diǎn)是如果你改變了對(duì)象B所指向的內(nèi)存地址,你同時(shí)也改變了對(duì)象A指向這個(gè)地址的字段弄企。
深拷貝超燃,這種方式會(huì)完全拷貝所有數(shù)據(jù),優(yōu)點(diǎn)是B與A不會(huì)相互依賴(A,B完全脫離關(guān)聯(lián))拘领, 缺點(diǎn)是拷貝的速度更慢意乓,代價(jià)更大 (可理解為耗費(fèi)了更多內(nèi)存空間)