深拷貝和淺拷貝

這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰html

深拷貝和淺拷貝的定義

拷貝賦值的區別:

1、賦值(Copy)數組

賦值是將某一數值或對象賦給某個變量的過程,分爲:markdown

一、基本數據類型:賦值,賦值以後兩個變量互不影響。函數

二、引用數據類型:賦,兩個變量具備相同的引用,指向同一個對象,相互之間有影響。oop

2、淺拷貝(Shallow Copy)post

一、什麼是淺拷貝spa

建立一個新對象,這個對象有着原始對象屬性值的一份精確拷貝。若是這個對象中的屬性基本類型,拷貝的就是基本類型的值,若是屬性是引用類型,拷貝的就是內存地址 ,因此若是其中一個對象改變了這個地址,就會影響到另外一個對象。prototype

my淺拷貝.png

上圖中,源對象包含基本類型屬性 field1 和引用類型屬性 refObj。淺拷貝以後基本類型數據 field2filed1 是不一樣屬性,互不影響。但引用類型 refObj 仍然是同一個,改變以後會對源對象產生影響。code

2.淺拷貝使用場景orm

2.1 Object.assign()

Object.assign() 方法用於將全部可枚舉屬性的值從一個或多個源對象複製到目標對象。它將返回目標對象。

2.2 展開操做符 ...

2.3 Array.prototype.slice方法

slice不會改變原數組,slice() 方法返回一個新的數組對象,這一對象是一個由 begin和 end(不包括end)決定的原數組的淺拷貝

3、深拷貝(Deep Copy)

一、 什麼是深拷貝?

my深拷貝.png

源對象包含基本類型屬性 field1 和引用類型屬性 refObj1。淺拷貝以後基本類型數據 field2filed1 是不一樣屬性,互不影響。引用類型 refObj1refObj2 是不一樣屬性,互不影響。深拷貝會拷貝全部的屬性,並拷貝屬性指向的動態分配的內存

4、總結

和原數據是否指向同一對象 第一層數據爲基本數據類型 原數據中包含子對象
賦值 改變會使原數據一塊兒改變 改變會使原數據一塊兒改變
淺拷貝 改變不會使原數據一塊兒改變 改變會使原數據一塊兒改變
深拷貝 改變不會使原數據一塊兒改變 改變不會使原數據一塊兒改變

2 使用深拷貝的場景

2.1 JSON.parse(JSON.stringify(object))

對數組深拷貝以後,改變原數組不會影響到拷貝以後的數組。

可是該方法有如下幾個問題:

(1)會忽略 undefined

(2)會忽略 symbol

(3)不能序列化函數

(4)不能解決循環引用的對象

(5)不能正確處理new Date()

(6)不能處理正則

 

其中(1)(2)(3) undefinedsymbol 和函數這三種狀況,會直接忽略。(4)循環引用會報錯,(5)* new Date 狀況下,轉換結果不正確解決方法:轉成字符串或者時間戳就行了。

手寫深拷貝

juejin.cn/post/684490…

參考:

1.賦值和拷貝www.cnblogs.com/chengxs/p/1…

2.手寫深拷貝juejin.cn/post/684490…

相關文章
相關標籤/搜索