[英]What are the dangers of Deep-copying objects using 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
檢查以下鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.