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