【问题标题】:What is the difference between Object.assign and JSON.parse(JSON.stringify(obj)) for deep cloning of an object?Object.assign 和 JSON.parse(JSON.stringify(obj)) 用于深度克隆对象有什么区别?
【发布时间】:2017-06-10 09:31:11
【问题描述】:

我想知道两者有什么区别

Object.assign({}, obj)

JSON.parse(JSON.stringify(obj))

用于深度克隆对象?如果他们有任何想法,谁能解释一下?

【问题讨论】:

标签: javascript javascript-objects


【解决方案1】:

区别在于

Object.assign({}, obj)

创建一个shallow copy,而不是deep,而

JSON.parse(JSON.stringify(obj))

serializes 将对象作为 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 }

另一方面,序列化-反序列化技巧会创建一个深层副本,其中所有内容都是从头开始创建的:

> 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

【讨论】:

  • 多么好的解释!!
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多