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 - Выбрасывается в одном из следующих случаев:
Описание
Свойства в целевом объекте перезаписываются свойствами из источников, если они имеют одинаковый ключ. Свойства более поздних источников перезаписывают свойства более ранних.
Метод Object.assign() копирует только перечислимые и собственные свойства из исходного объекта в целевой объект. Он использует [[Get]] на источнике и [[Set]] на цели, поэтому он будет вызывать геттеры и сеттеры. Следовательно, он присваивает свойства, в отличие от копирования или определения новых свойств. Это может сделать его непригодным для объединения новых свойств в прототип, если источники объединения содержат геттеры.
Для копирования определений свойств (включая их перечислимость) в прототипы используйте Object.getOwnPropertyDescriptor() и Object.defineProperty() вместо этого.
Копируются как свойства String, так и Symbol.
В случае ошибки, например, если свойство недоступно для записи, выбрасывается TypeError, и объект target изменяется, если какие-либо свойства были добавлены до возникновения ошибки.
Примеры
Клонирование объекта
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 } }
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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.assignincore-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