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).