Разница заключается в том, что
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
'Object.assign' не DeepCopy, он [«копирует значения всех перечислимых собственных свойств из одного или нескольких объектов источника к целевому объекту.»] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –
Здесь в консоли хром var obj1 = {"d": 22, "k": 33} var obj2 = Object.assign ({}, obj1) obj2 Объект {д: 22, K: 33} obj2.k = 44 obj1 Объект {д: 22, K: 33} ... Здесь obj1 сделал не изменится, значит, это означает, что это глубокая копия? – Ram
Нет, это мелкая копия. Вы изменяете собственные свойства копии. Попробуйте создать объект объектов, сделав копию, а затем переведя объекты «указали на». –