JS: Создает ли Object.assign() глубокую копию или мелкую копию
Я натолкнулся на эту концепцию
var copy = Object.assign({}, originalObject);
который создает копию исходного объекта в объект copy
. Однако, мой вопрос заключается в том, создает ли этот способ клонирования объект глубокой копии или мелкой копии?
PS: путаница, если она создает глубокую копию, тогда это был бы самый простой способ клонировать объект.
Ответы
Ответ 1
Забудьте о глубокой копии, даже неглубокая копия небезопасна, если объект, который вы копируете, имеет свойство с атрибутом enumerable
, установленным в false.
MDN:
Метод Object.assign() копирует только перечисленные и собственные свойства от исходного объекта до целевого объекта
возьмите этот пример
var o = {};
Object.defineProperty(o,'x',{enumerable: false,value : 15});
var ob={};
Object.assign(ob,o);
console.log(o.x); // 15
console.log(ob.x); // undefined
Ответ 2
Используя Object.assign()
, вы фактически выполняете Неверное копирование вашего объекта. Всякий раз, когда мы выполняем операцию, такую как присвоение одного объекта другому, мы фактически выполняем мелкую копию, то есть если OBJ1 является объектом, изменяя его через другой объект, который является OBJ2, также будет отражать изменения в OBJ1.
Ответ 3
Он создает мелкую копию, согласно этот абзац из MDN:
Для глубокого клонирования нам нужно использовать другие альтернативы, потому что Object.assign() копирует значения свойств. Если исходное значение является ссылку на объект, он копирует только это ссылочное значение.
Для целей сокращения x Object.assign()
достаточно, потому что состояние приложения redux содержит только неизменяемые значения (JSON).