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