JS中數(shù)組和對象的 深復(fù)制(拷貝)與淺復(fù)制(拷貝)
1.js中有五種簡單的數(shù)據(jù)類型(null李茫,string,undefined肥橙,number魄宏,boolean)和一種復(fù)雜數(shù)據(jù)類型(Object),當(dāng)我們復(fù)制簡單類型時(shí)存筏,效果如下
也就是說 當(dāng)b被重新賦值時(shí) a并不會被改變宠互。
但是當(dāng)我們復(fù)制復(fù)雜的數(shù)據(jù)類型時(shí)以數(shù)組為例 ,效果如下
我們看到 當(dāng)我們改變b的值時(shí)椭坚,a也被改變了予跌,這顯然不是我們想要的結(jié)果,所以便出現(xiàn)了深復(fù)制這個(gè)說法善茎,下面以數(shù)組為例券册,說明一下數(shù)組深復(fù)制的方法。
2,數(shù)組的深復(fù)制
(1)for循環(huán)
循環(huán)賦值烁焙,改變b的值 不會影響a的值航邢,下面穿插一個(gè)知識點(diǎn): 數(shù)組中循環(huán)最好不要用for in ,因?yàn)閒or in 循環(huán) 會循環(huán)出原型鏈上的內(nèi)容骄蝇,當(dāng)數(shù)組原型鏈上聲明了方法膳殷,我們得到的結(jié)果就不是我們想要的了。
(2)slice方法
slice方法的定義為:返回一個(gè)新的數(shù)組九火,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素赚窃;
重點(diǎn)在? 返回一個(gè) 新的數(shù)組 ,也就是說不會改變原數(shù)組岔激,也就是達(dá)到了我們的目的
補(bǔ)充知識點(diǎn):slice中參數(shù)為負(fù)數(shù)時(shí)勒极,則用數(shù)組長度加上該數(shù)來確定相應(yīng)的位置
(3)concat方法
concat() 方法用于連接兩個(gè)或多個(gè)數(shù)組。該方法不會改變現(xiàn)有的數(shù)組鹦倚,而僅僅會返回被連接數(shù)組的一個(gè)副本
鏈接一個(gè)空數(shù)組還是原有數(shù)組河质,從而達(dá)到復(fù)制的目的,生成新的數(shù)組震叙,不會改變原有數(shù)組
(4)ES6的 “...“ 擴(kuò)展運(yùn)算符 :?將一個(gè)數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列掀鹅。
3.對象的深復(fù)制
(1)for循環(huán) 實(shí)現(xiàn)深復(fù)制
(2)轉(zhuǎn)換成json再轉(zhuǎn)換成對象