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 の中身は書き換わりません。これにより、データの不整合を防ぐ安全なプログラミングが可能になります。