Spec-Zone.ru › JavaScript

Object.assign()

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

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

Попробовать

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget === target);
// Expected output: true

Синтаксис

Object.assign(target)
Object.assign(target, source1)
Object.assign(target, source1, source2)
Object.assign(target, source1, source2, /* …, */ sourceN)

Параметры

target
Целевой объект — тот, к которому применяются свойства источников и который возвращается после изменения. Если в качестве цели предоставлено примитивное значение, оно будет преобразовано в объект.
source1, …, sourceN
Исходный объект(ы) — объекты, содержащие свойства, которые вы хотите применить.

Возвращаемое значение

Целевой объект.

Исключения

TypeError
Выбрасывается в одном из следующих случаев:
  • Параметр target равен null или undefined.
  • Не удается присвоить свойство целевому объекту; например, потому что свойство недоступно для записи (non-writable) в целевом объекте, или потому что его сеттер (setter) выбрасывает ошибку.

Описание

Свойства в целевом объекте перезаписываются свойствами из источников, если они имеют одинаковый ключ. Свойства более поздних источников перезаписывают свойства более ранних.

Метод Object.assign() копирует только перечислимые и собственные свойства из исходного объекта в целевой объект. Он использует [[Get]] на источнике и [[Set]] на цели, поэтому он будет вызывать геттеры и сеттеры. Следовательно, он присваивает свойства, в отличие от копирования или определения новых свойств. Это может сделать его непригодным для объединения новых свойств в прототип, если источники объединения содержат геттеры.

Для копирования определений свойств (включая их перечислимость) в прототипы используйте Object.getOwnPropertyDescriptor() и Object.defineProperty() вместо этого.

Копируются как свойства String, так и Symbol.

В случае ошибки, например, если свойство недоступно для записи, выбрасывается TypeError, и объект target изменяется, если какие-либо свойства были добавлены до возникновения ошибки.

Примечание: Object.assign() не выбрасывает ошибку при работе с источниками null или undefined.

Примеры

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

const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

Предупреждение о глубоком клонировании

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

Если исходное значение является ссылкой на объект, копируется только значение ссылки.

const obj1 = { a: 0, b: { c: 0 } };
const obj2 = Object.assign({}, obj1);
console.log(obj2); // { a: 0, b: { c: 0 } }

obj1.a = 1;
console.log(obj1); // { a: 1, b: { c: 0 } }
console.log(obj2); // { a: 0, b: { c: 0 } }

obj2.a = 2;
console.log(obj1); // { a: 1, b: { c: 0 } }
console.log(obj2); // { a: 2, b: { c: 0 } }

obj2.b.c = 3;
console.log(obj1); // { a: 1, b: { c: 3 } }
console.log(obj2); // { a: 2, b: { c: 3 } }

// Deep Clone
const obj3 = { a: 0, b: { c: 0 } };
const obj4 = structuredClone(obj3);
obj3.a = 4;
obj3.b.c = 4;
console.log(obj4); // { a: 0, b: { c: 0 } }

Слияние объектов

const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };

const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, target object itself is changed.

Слияние объектов с одинаковыми свойствами

const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };

const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

Свойства перезаписываются другими объектами, имеющими те же свойства, которые следуют позже в порядке параметров.

Копирование свойств типа Symbol

const o1 = { a: 1 };
const o2 = { [Symbol("foo")]: 2 };

const obj = Object.assign({}, o1, o2);
console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox)
Object.getOwnPropertySymbols(obj); // [Symbol(foo)]

Свойства в цепочке прототипов и неперечислимые свойства не могут быть скопированы

const obj = Object.create(
  // foo is on obj's prototype chain.
  { foo: 1 },
  {
    bar: {
      value: 2, // bar is a non-enumerable property.
    },
    baz: {
      value: 3,
      enumerable: true, // baz is an own enumerable property.
    },
  },
);

const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }

Примитивы будут обёрнуты в объекты

const v1 = "abc";
const v2 = true;
const v3 = 10;
const v4 = Symbol("foo");

const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
// Primitives will be wrapped, null and undefined will be ignored.
// Note, only string wrappers can have own enumerable properties.
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

// Primitives as the target are also wrapped to objects
const number = Object.assign(3, { a: 1 });
console.log(number); // Number {3, a: 1}
console.log(typeof number); // object
console.log(number.a); // 1

// null and undefined as targets throw TypeError
try {
  Object.assign(null, { a: 1 });
} catch (e) {
  console.log(e.message); // "Cannot convert undefined or null to object"
}

Исключения прервут текущую задачу копирования

const target = Object.defineProperty({}, "foo", {
  value: 1,
  writable: false,
}); // target.foo is a read-only property

Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
// TypeError: "foo" is read-only
// The Exception is thrown when assigning target.foo

console.log(target.bar); // 2, the first source was copied successfully.
console.log(target.foo2); // 3, the first property of the second source was copied successfully.
console.log(target.foo); // 1, exception is thrown here.
console.log(target.foo3); // undefined, assign method has finished, foo3 will not be copied.
console.log(target.baz); // undefined, the third source will not be copied either.

Копирование аксессоров

const obj = {
  foo: 1,
  get bar() {
    return 2;
  },
};

let copy = Object.assign({}, obj);
console.log(copy);
// { foo: 1, bar: 2 }
// The value of copy.bar is obj.bar's getter's return value.

// This is an assign function that copies full descriptors
function completeAssign(target, ...sources) {
  sources.forEach((source) => {
    const descriptors = Object.keys(source).reduce((descriptors, key) => {
      descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
      return descriptors;
    }, {});

    // By default, Object.assign copies enumerable Symbols, too
    Object.getOwnPropertySymbols(source).forEach((sym) => {
      const descriptor = Object.getOwnPropertyDescriptor(source, sym);
      if (descriptor.enumerable) {
        descriptors[sym] = descriptor;
      }
    });
    Object.defineProperties(target, descriptors);
  });
  return target;
}

copy = completeAssign({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-object.assign

Совместимость с браузерами

Десктоп Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
assign
45
12
34
32
9
45
34
32
9
5.0
45
9
1.0.0
1.0
4.0.0

См. также

  • Polyfill of Object.assign in core-js
  • es-shims polyfill of Object.assign
  • Object.defineProperties()
  • Перечислимость и владение свойствами
  • Расширение (Spread) в литералах объектов

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API