簡體   English   中英

用於對象深度克隆的 Object.assign 和 JSON.parse(JSON.stringify(obj)) 之間有什么區別?

[英]What is the difference between Object.assign and JSON.parse(JSON.stringify(obj)) for deep cloning of an object?

我想知道兩者之間有區別嗎

Object.assign({}, obj)

JSON.parse(JSON.stringify(obj))

用於對象的深度克隆? 任何人都可以解釋他們是否有任何想法?

不同之處在於

Object.assign({}, obj)

創建一個淺層副本 ,而不是深層

JSON.parse(JSON.stringify(obj))

將對象序列化為 JSON字符串,然后對其進行反序列化,從而有效地創建深層副本。

如果所有屬性都指向原始值,或者您無意改變副本引用的對象,則淺拷貝就可以了。 如果這樣做,更改將在原始副本和淺副本中都可見,因為它們都引用相同的對象:

> let a = { k: { h: 1 } };
> let b = Object.assign({}, a);
> b.k.h = 2;
> a
{ k: { h: 2 } }
> b
{ k: { h: 2 } }

您當然可以改變副本本身,而不會對原始版本產生任何影響:

> b.j = 4
> b.k = { new: 'object' }
> a
{ k: { h: 2 } }
> b
{ k: { new: 'object' }, j: 4 }

另一方面,serialize-deserialize技巧創建了一個深層副本,其中所有內容都是從頭開始創建的:

> let c = JSON.parse(JSON.stringify(b));
> c
{ k: { h: 2 } }
> c.k.h = 3
> c
{ k: { h: 3 } }
> a
{ k: { h: 2 } }
> b
{ k: { h: 2 } }

檢查身份的另一種方法是使用嚴格的相等:

> let a = { k: { h: 1 } };
> let b = Object.assign({}, a);
> a.k === b.k  // both point to the same object
true
> let c = JSON.parse(JSON.stringify(b));
> c.k === b.k  // different objects
false

我認為結果是一樣的,但性能測試存在差異,object.assign比JSON.parse(JSON.stringify(obj))快得多。

因此,如果您關心性能,最好使用object.assign

檢查以下鏈接:

JSON.parse(JSON.stringify(obj)) vs Object.assign({}, obj)基准

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM