轉自高階前端進階公眾號
深拷貝和淺拷貝是針對複雜資料型別來說的,淺拷貝只拷貝一層,而深拷貝是層層拷貝。
深拷貝
深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,再複製。深拷貝後的物件與原來的物件是完全隔離的,互不影響,對一個物件的修改並不會影響另一個物件。
淺拷貝
淺拷貝是會將物件的每個屬性進行依次複製,但是當物件的屬性值是引用型別時,實質複製的是其引用,當引用指向的值改變時也會跟著變化。
可以使用 forin
、 Object.assign
、 擴充套件運算子 ...
、 Array.prototype.slice()
、 Array.prototype.concat()
等,例如:
可以看出淺拷貝只最第一層屬性進行了拷貝,當第一層的屬性值是基本資料型別時,新的物件和原物件互不影響,但是如果第一層的屬性值是複雜資料型別,那麼新物件和原物件的屬性值其指向的是同一塊記憶體地址。
深拷貝實現
1.深拷貝最簡單的實現是:
JSON.parse(JSON.stringify(obj))
JSON.parse(JSON.stringify(obj))
是最簡單的實現方式,但是有一些缺陷:
物件的屬性值是函式時,無法拷貝。
原型鏈上的屬性無法拷貝
不能正確的處理 Date 型別的資料
不能處理 RegExp
會忽略 symbol
會忽略 undefined
2.實現一個 deepClone 函式
如果是基本資料型別,直接返回
如果是
RegExp
或者Date
型別,返回對應型別如果是複雜資料型別,遞迴。
考慮迴圈引用的問題