Object.assign() の使い方
Object.assign() は、1つ以上のソースオブジェクトから、ターゲットオブジェクトにプロパティをコピーするメソッドです。オブジェクトのマージやシャローコピーによく使用されます。
基本的な使い方
第1引数がターゲット(コピー先)、第2引数以降がソース(コピー元)です。
const target = { a: 1 };
const source = { b: 2 };
const result = Object.assign(target, source);
console.log(result); // { a: 1, b: 2 }
console.log(target); // { a: 1, b: 2 }(ターゲットも変更される)重要な点として、Object.assign() はターゲットオブジェクト自体を変更し、それを戻り値として返します。
オブジェクトのシャローコピー
空のオブジェクトをターゲットにすることで、シャローコピーを作成できます。
const original = { name: "田中", age: 25 };
const copy = Object.assign({}, original);
copy.name = "山田";
console.log(original.name); // "田中"(影響なし)複数オブジェクトのマージ
複数のソースオブジェクトを指定すると、順番にマージされます。同じキーがある場合、後のオブジェクトの値で上書きされます。
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const obj3 = { c: 5, d: 6 };
const merged = Object.assign({}, obj1, obj2, obj3);
console.log(merged); // { a: 1, b: 3, c: 5, d: 6 }obj1 のプロパティをコピー
obj2 のプロパティをコピー(b を上書き)
obj3 のプロパティをコピー(c を上書き)
デフォルト値の設定
Object.assign() を使って、オプションにデフォルト値を設定するパターンがよく使われます。
function createUser(options) {
const defaults = {
name: "名無し",
age: 0,
active: true
};
const user = Object.assign({}, defaults, options);
return user;
}
const user1 = createUser({ name: "田中" });
console.log(user1); // { name: "田中", age: 0, active: true }シャローコピーであることに注意
Object.assign() はシャローコピーです。ネストしたオブジェクトは参照がコピーされるだけで、深いコピーにはなりません。
const original = {
name: "田中",
address: { city: "東京" }
};
const copy = Object.assign({}, original);
copy.address.city = "大阪";
console.log(original.address.city); // "大阪"(影響を受ける!)ネストしたオブジェクトも含めて完全にコピーしたい場合は、structuredClone() やスプレッド構文との組み合わせを検討してください。
スプレッド構文との比較
ES6 以降では、スプレッド構文を使う方が簡潔に書けるため、Object.assign() の代わりに使われることが増えています。
// Object.assign()
const copy1 = Object.assign({}, obj1, obj2);
// スプレッド構文(同じ結果)
const copy2 = { ...obj1, ...obj2 };ただし、Object.assign() はターゲットオブジェクトを直接変更できる点で、用途によっては便利な場面もあります。