Object.assign () - очень полезный метод для копирования значений из одного объекта в другой. Он принимает два параметра: целевой объект и источник для копирования. Оба параметра должны быть объектами. Мы можем копировать более чем с одного объекта. Давайте сразу перейдем к простому примеру:

const objToCopyFrom = {
  prop1: true,
  prop2: 'false'
};
const objToCopyInto = Object.assign({}, objToCopyFrom); // {prop1: true, prop2: "false"}

В случае копирования из нескольких объектов мы можем разделить значения запятой:

const obj1 = { first: 1 };
const obj2 = { second: 2 };
const obj3 = { third: 3 };
const target = Object.assign({}, obj1, obj2, obj3); // {first: 1, second: 2, third: 3}

Целевой объект не всегда должен быть пустым:

const prefilled = { some: 'value' };
const added = Object.assign(prefilled, { other: 'value' }); // {some: "value", other: "value"}

Если свойство существует, оно будет переопределено:

const altered = Object.assign(prefilled, { some: 'this will be a new val' }); // {some: "this will be a new val"}

Важно отметить, что будут скопированы только перечислимые свойства. Что это? Ну, enumerable - это специальный флаг, установленный для объекта. Если установлено значение true - свойство будет включено там, где мы перебираем объект. Когда мы создаем объект, у него по умолчанию установлены некоторые флаги.
Мы можем прочитать их значения с помощью метода Object.getOwnPropertyDescriptors ()
:

const objDescriptors = {
  example: true,
  another: false
};
Object.getOwnPropertyDescriptors(objDescriptors);

даст:

Подтверждаем, что копировать можно только перечислимые свойства:

const obj = {};
Object.defineProperty(obj, 'notEnumerable', {
enumerable: false
});
let newObj = Object.assign({}, obj); // {}, property not copied
Object.defineProperty(obj, 'enumerable', {
enumerable: true,
value: 'copied'
});
newObj = Object.assign({}, obj); // {enumerable: "copied"}

Установка флага enumerable в значение false предотвратит копирование этого свойства.

В качестве альтернативы вы можете использовать синтаксис распространения для копирования:

const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const copy = { ...obj1, ...obj2 }; // {a: 1, b: 2, c: 3, d: 4}

В отличие от Object.assign (), сеттеры не запускаются.