6.4 オブジェクトのその他の便利な機能
5 章では配列に対するスプレッド構文と分割代入を学習しました。本節では、同じ構文をオブジェクトに対して使う方法を確認します。これらは、React や Vue.js などのフレームワークでも頻繁に使用されます。
とても便利な機能なのですが、ここでは、こんなこともできる程度に紹介しておきます。まずは、これまでのオブジェクトや JSON に十分に慣れてから、余裕ができた時に振り返ってください。
分割代入(Destructuring Assignment)
分割代入は、オブジェクトや配列からデータを取り出して、個別の変数に代入する記述方法です。これまでのように obj.name のようにドットで一つずつアクセスする必要がなくなるため、コードがすっきりします。
時間がある時に、5.1.1 で作った object.js を以下の様に変更して、分割代入を試してください。
// 1. テスト用のユーザーオブジェクト
const user = {
id: 101,
name: "Alice",
email: "alice@example.com",
address: {
city: "Tokyo",
zip: "100-0001"
}
};
// 【歴史】従来の書き方(一つずつ取り出す)
// const name = user.name;
// const email = user.email;
// 【現代】分割代入を使った書き方
// プロパティ名と同じ名前の変数に、自動的に値が入ります
const { name, email } = user;
// ネスト(入れ子)されたオブジェクトからも取り出せます
const { city } = user.address;
alert(`名前: ${name}¥n メール: ${email}¥n 都市: ${city}`)
スプレッド構文(Spread Syntax)
スプレッド構文は、…(ドット 3 つ)を使って、オブジェクトや配列の中身を「展開(コピー)」する機能です。既存のオブジェクトを元にして「元のデータは変更せずに、新しいコピーを作る」際や、「複数のオブジェクトを結合する」際に威力を発揮します。
const baseUser = {
name: "Bob",
role: "Admin"
};
// 1. オブジェクトのコピーとプロパティの追加
// baseUser の中身を「...」で展開し、さらに age を追加した新しいオブジェクトを作ります
const updatedUser = {
...baseUser, // name: "Bob", role: "Admin" がここに展開されます
age: 30 // 新しいプロパティを追加
};
// 2. プロパティの上書き
// 同じプロパティ名(role)を後から書くと、値が上書きされます
const changedUser = {
...updatedUser,
role: "User" // Admin から User に変更
};
// 結果の確認(JSON 文字列にして見やすく表示)
alert("元のユーザー:¥n" + JSON.stringify(baseUser));
alert("拡張したユーザー:¥n" + JSON.stringify(updatedUser));
alert("変更したユーザー:¥n" + JSON.stringify(changedUser));
8 行目で、新たに updatedUser を定義するときに、…baseUser と記述することで、baseUser が持っているプロパティ(name, role)がその場に展開(コピー)されます。その上で、新しいプロパティ age を追加しました。
さらに、13 行目で changedUser を定義するときに、元の updatedUser に存在するプロパティ名 role を書くことで、特定の値を上書き(更新)することができます。
この操作を行っても、元の baseUser の中身は書き換わりません。これにより、データの不整合を防ぐ安全なプログラミングが可能になります。
