2017-01-25 2 views
6

Я хочу знать, есть ли разница междуВ чем разница между Object.assign и JSON.parse (JSON.stringify (obj)) для глубокого клонирования объекта?

Object.assign({}, obj) 

и

JSON.parse(JSON.stringify(obj)) 

для глубокого клонирования объекта? Может ли кто-нибудь объяснить, есть ли у них какие-либо идеи?

+0

'Object.assign' не DeepCopy, он [«копирует значения всех перечислимых собственных свойств из одного или нескольких объектов источника к целевому объекту.»] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –

+0

Здесь в консоли хром var obj1 = {"d": 22, "k": 33} var obj2 = Object.assign ({}, obj1) obj2 Объект {д: 22, K: 33} obj2.k = 44 obj1 Объект {д: 22, K: 33} ... Здесь obj1 сделал не изменится, значит, это означает, что это глубокая копия? – Ram

+0

Нет, это мелкая копия. Вы изменяете собственные свойства копии. Попробуйте создать объект объектов, сделав копию, а затем переведя объекты «указали на». –

ответ

12

Разница заключается в том, что

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 } 

сериализация-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 
0

Я думаю, что результат тот же, но есть разница в тесте производительности, object.assign намного быстрее, чем JSON.parse (JSON.stringify (obj)).

Так что, если вы заботитесь о производительности, то лучше использовать object.assign

проверить ссылку ниже:

enter link description here

Смежные вопросы