淺拷貝: 淺拷貝指的是將一個(gè)對(duì)象的屬性值復(fù)制到另一個(gè)對(duì)象,如果有的屬性的值為引用類(lèi)型的話(huà),那么會(huì)將這個(gè)引用的地址復(fù)制給對(duì)象,因此兩個(gè)對(duì)象會(huì)有同一個(gè)引用類(lèi)型的引用。淺拷貝可以使用 Object.assign 和展開(kāi)運(yùn)算符來(lái)實(shí)現(xiàn)。
深拷貝: 深拷貝相對(duì)淺拷貝而言,如果遇到屬性值為引用類(lèi)型的時(shí)候,它新建一個(gè)引用類(lèi)型并將對(duì)應(yīng)的值復(fù)制給它,因此對(duì)象獲得的一個(gè)新的引用類(lèi)型而不是一個(gè)原有類(lèi)型的引用。深拷貝對(duì)于一些對(duì)象可以使用 JSON 的兩個(gè)函數(shù)來(lái)實(shí)現(xiàn),但是由于 JSON 的對(duì)象格式比 js 的對(duì)象格式更加嚴(yán)格,所以如果屬性值里邊出現(xiàn)函數(shù)或者 Symbol 類(lèi)型的值時(shí),會(huì)轉(zhuǎn)換失敗
(1)JSON.stringify()JSON.parse(JSON.stringify(obj))是目前比較常用的深拷貝方法之一,它的原理就是利用JSON.stringify 將js對(duì)象序列化(JSON字符串),再使用JSON.parse來(lái)反序列化(還原)js對(duì)象。
這個(gè)方法可以簡(jiǎn)單粗暴的實(shí)現(xiàn)深拷貝,但是還存在問(wèn)題,拷貝的對(duì)象中如果有函數(shù),undefined,symbol,當(dāng)使用過(guò)JSON.stringify()進(jìn)行處理之后,都會(huì)消失。
(2)函數(shù)庫(kù)lodash的_.cloneDeep方法
該函數(shù)庫(kù)也有提供_.cloneDeep用來(lái)做 Deep Copy
(3)手寫(xiě)實(shí)現(xiàn)深拷貝函數(shù)