分割代入
このレッスンで分かること
const { name, role } = profileで、必要な値をまとめて変数に取り出せます- 既定値が効くのは、値が
undefinedのときだけです
同じ名前を 2 回書く行が並ぶ
オブジェクトから値を取り出す方法は身に付きました。ただ、実際に書いてみると気になることがあります。
JavaScript
function describeProfile(profile) {
const name = profile.name;
const role = profile.role;
const since = profile.since;
return name + " / " + role + " / " + since + " 年から";
}name という単語が 1 行に 2 回出てきます。やっているのは同じ名前の変数に移し替えるだけなのに、行数だけが増えていきます。
JavaScript
const { name, role, since } = profile;これが分割代入です。箱から必要な値を取り出して名前を付けるための道具で、{} の中に書いたキー名と同じ名前の変数が作られ、対応する値が入ります。要らないキーは書かなくてかまいませんし、キーの名前で対応を取るので順番も自由です。3 行が 1 行になりました。
無いキーには既定値を添えられる
対応するキーが無いときは undefined が入ります。そこで既定値を書けます。
JavaScript
const { role = "学習中" } = { name: "山田 太郎" };
console.log(role); // 学習中 role が無いので既定値になる
const { level = 0 } = { level: null };
console.log(level); // null 既定値は使われない既定値が使われるのは、値が undefined のときだけです。null や 0 や "" が入っていれば、そのままの値が採用されます。この基準は ?? や ?. と同じで、第3章から一貫しています。
キー名をそのまま変数名にしたくないときは、コロン記号で付け替えられます。
| 書き方 | 意味 |
|---|---|
const { name } = profile | profile.name を name に取り出す |
const { name = "匿名" } = profile | 無いときは "匿名" を使う |
const { name: author } = profile | 変数名を author に変える |
const { name: author = "匿名" } = profile | 付け替えと既定値を同時に使う |
配列でも同じことができますが、こちらは名前ではなく位置で対応を取ります。左辺は [] です。
JavaScript
const [first, second] = ["HTML", "CSS", "JavaScript"];
console.log(first, second); // HTML CSSオブジェクトは名前で、配列は位置で対応する。この違いが、意味の違う値をオブジェクトで返すべき理由そのものです。
引数の位置で、そのまま開ける
分割代入がいちばん活きるのは関数の引数です。引数の位置に直接 {} を書けます。
JavaScript
function describeSkill({ label, level = 1 }) {
return label + " レベル" + level;
}
console.log(describeSkill({ label: "CSS", level: 3 })); // CSS レベル3
console.log(describeSkill({ label: "HTML" })); // HTML レベル1呼ぶ側はオブジェクトを 1 つ渡すだけ、関数の中は最初から必要な値が変数になった状態から始められます。既定値も同じように書けるので、キーが欠けた入力もその場で埋まります。
よくある間違い
- 付け替えの向きを逆にする — 左がキー、右が新しい変数名です。「元の名前 から 新しい名前」の順と覚えます
- オブジェクトなのに
[]で受ける — 配列は[]、オブジェクトは{}です。オブジェクトは位置を持たないので、[]では取り出せずTypeErrorになります
要件
- 関数名は
formatWork、引数は作品オブジェクト 1 つ - 引数の位置で
{ title, year }の分割代入を使うこと titleの既定値は"無題"、yearの既定値は"年不明"- 戻り値は
"タイトル (年)"の形の文字列。カッコの前に半角スペースを 1 つ入れること
入出力例
formatWork({"title":"プロフィールサイト","year":2026}) → "プロフィールサイト (2026)"
formatWork({"title":"自己紹介カード"}) → "自己紹介カード (年不明)"
formatWork({"year":2026}) → "無題 (2026)"
formatWork({}) → "無題 (年不明)"
formatWork({"title":"スキル一覧の表","year":2026}) → "スキル一覧の表 (2026)"ヒント
編集 ゆめさく編集部