深拷貝和淺拷貝的區別是什麼?實現一個深拷貝

前端張小明發表於2020-03-06

轉自高階前端進階公眾號

深拷貝和淺拷貝是針對複雜資料型別來說的,淺拷貝只拷貝一層,而深拷貝是層層拷貝。

深拷貝

深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,再複製。深拷貝後的物件與原來的物件是完全隔離的,互不影響,對一個物件的修改並不會影響另一個物件。

淺拷貝

淺拷貝是會將物件的每個屬性進行依次複製,但是當物件的屬性值是引用型別時,實質複製的是其引用,當引用指向的值改變時也會跟著變化。

可以使用 forinObject.assign、 擴充套件運算子 ...Array.prototype.slice()Array.prototype.concat() 等,例如:

深拷貝和淺拷貝的區別是什麼?實現一個深拷貝

可以看出淺拷貝只最第一層屬性進行了拷貝,當第一層的屬性值是基本資料型別時,新的物件和原物件互不影響,但是如果第一層的屬性值是複雜資料型別,那麼新物件和原物件的屬性值其指向的是同一塊記憶體地址。

深拷貝實現

1.深拷貝最簡單的實現是: JSON.parse(JSON.stringify(obj))

JSON.parse(JSON.stringify(obj)) 是最簡單的實現方式,但是有一些缺陷:

  1. 物件的屬性值是函式時,無法拷貝。

  2. 原型鏈上的屬性無法拷貝

  3. 不能正確的處理 Date 型別的資料

  4. 不能處理 RegExp

  5. 會忽略 symbol

  6. 會忽略 undefined

2.實現一個 deepClone 函式

  1. 如果是基本資料型別,直接返回

  2. 如果是 RegExp 或者 Date 型別,返回對應型別

  3. 如果是複雜資料型別,遞迴。

  4. 考慮迴圈引用的問題

深拷貝和淺拷貝的區別是什麼?實現一個深拷貝


相關文章