Object.assign() в JavaScript

Object.assign() копирует свойства из одного или нескольких объектов в другой объект.

let user = {
  name: 'Анна',
};

let result = Object.assign(user, { age: 28 });

console.log(user); // { name: 'Анна', age: 28 }
console.log(result); // { name: 'Анна', age: 28 }

Метод возвращает объект, в который были скопированы свойства. В примере выше это тот же объект user.

Что делает Object.assign()

Object.assign() берет свойства из объектов-источников и добавляет их в целевой объект.

let target = {};

let source = {
  name: 'Анна',
  age: 28,
};

Object.assign(target, source);

console.log(target); // { name: 'Анна', age: 28 }

Здесь target - объект, куда копируем свойства. source - объект, откуда берем свойства.

Синтаксис

Object.assign(target, source1, source2, source3);

target - объект, который будет изменен.

source - объект, свойства которого нужно скопировать.

Источников может быть несколько. Свойства копируются слева направо.

Копирование объекта

Частый вариант использования - создать копию простого объекта.

let user = {
  name: 'Анна',
  age: 28,
};

let copy = Object.assign({}, user);

console.log(copy); // { name: 'Анна', age: 28 }

Первым аргументом передали пустой объект . Поэтому исходный объект user не изменяется, а свойства попадают в новый объект.

copy.age = 29;

console.log(copy.age); // 29
console.log(user.age); // 28

Для простого копирования в современном коде часто используют spread, но Object.assign() тоже встречается и работает нормально.

Объединение объектов

Методом Object.assign() можно собрать один объект из нескольких.

let user = {
  name: 'Анна',
};

let contacts = {
  email: 'anna@example.com',
};

let settings = {
  theme: 'dark',
};

let profile = Object.assign({}, user, contacts, settings);

console.log(profile);
// { name: 'Анна', email: 'anna@example.com', theme: 'dark' }

Здесь мы снова начинаем с пустого объекта, чтобы не менять user, contacts и settings.

Перезапись свойств

Если свойства называются одинаково, значение справа перезапишет значение слева.

let defaultSettings = {
  theme: 'light',
  fontSize: 16,
};

let userSettings = {
  theme: 'dark',
};

let settings = Object.assign({}, defaultSettings, userSettings);

console.log(settings); // { theme: 'dark', fontSize: 16 }

Сначала в новый объект попали значения из defaultSettings, затем theme был перезаписан значением из userSettings.

Это удобно, когда есть настройки по умолчанию и настройки пользователя.

Поверхностная копия

Object.assign() создает поверхностную копию. Если внутри объекта есть вложенный объект, он не копируется глубоко.

let user = {
  name: 'Анна',
  address: {
    city: 'Москва',
  },
};

let copy = Object.assign({}, user);

copy.address.city = 'Казань';

console.log(user.address.city); // Казань
console.log(copy.address.city); // Казань

Свойство address скопировалось как ссылка на тот же вложенный объект. Поэтому изменение видно и в оригинале, и в копии.

Если нужна независимая копия с вложенными объектами, можно использовать structuredClone(), но это уже отдельная задача.

Итого

  • Object.assign() копирует свойства из одних объектов в другой.
  • Первый аргумент изменяется и возвращается из метода.
  • Object.assign({}, object) создает новый объект с теми же свойствами.
  • Если свойства совпадают, более правый объект перезаписывает значение.
  • Метод создает поверхностную копию.