1. 全ての値がそろっている作品
  2. stats と tags が無い作品
  3. 空のオブジェクトを渡したとき
  4. 引数を渡さなかったとき
  5. views が 0 で tags が空配列のとき
コース一覧
モダンJavaScript:データ処理とコード設計
分割代入で必要な値だけ取り出す

モダンJavaScript:データ処理とコード設計

配列の map・filter・reduce・sort、クロージャと高階関数、オブジェクトとクラス、エラー設計、正規表現を学ぶ全 36 レッスン(665 分)のコースです。ローカルの作品データを題材に、表示とデータを分け、絞り込み・並び替え・入力検証までを組み立てます。Promise、fetch、API 通信、モジュールは次のコースで扱います。

1
土台をそろえる
01. このコースで育てるもの15分
02. strict mode が先に教えてくれる間違い15分
03. 表示とデータを切り分ける20分
04. 第1章まとめクイズ10分
2
配列をパイプラインで扱う
01. map で形を変える20分
02. filter と find で絞り込む20分
03. reduce でひとつにまとめる20分
04. sort と比較関数20分
05. 分類してまとめる groupBy20分
06. つなげて組み立てる20分
07. つくる 作品一覧の絞り込みと並び替え30分
08. 第2章まとめクイズ10分
3
関数を道具にする
01. クロージャで状態を閉じ込める20分
02. 設定を覚えた関数をつくる20分
03. 関数を返す関数20分
04. 副作用のない関数20分
05. 第3章まとめクイズ10分
4
オブジェクトを扱いきる
01. 分割代入で必要な値だけ取り出す20分
02. スプレッドとレストで組み替える20分
03. keys と values と entries20分
04. ビット演算でフラグをまとめる20分
05. 第4章まとめクイズ10分
5
クラスで型をつくる
01. クラスとインスタンス20分
02. private フィールドとアクセサ20分
03. 継承と super20分
04. 多態と static20分
05. つくる 作品コレクションをクラスにする30分
06. 第5章まとめクイズ10分
6
エラーを設計する
01. try catch finally20分
02. 自分でエラーを投げる20分
03. 失敗を画面に出す25分
04. 第6章まとめクイズ10分
7
正規表現
01. 正規表現のきほん20分
02. 入力を検証する20分
03. 置換とキャプチャ20分
04. 第7章まとめクイズ10分

分割代入で必要な値だけ取り出す

名前を変えて受ける・無いときの既定値
解説

このレッスンで分かること

  • 引数の位置で開くと、関数の 1 行目が「この関数が使う値の一覧」になります
  • 途中の階層が無いところで止まらないよう、階層ごとに受け皿を置きます

関数の 1 行目を見ても、何を使うのか分からない

入門では const { name } = profile; のように、関数の中で開く形を覚えました。実践では置き場所を一段前に動かします。関数の中ではなく、引数の位置に書きます。

JavaScript

// 中で開く。呼び出す側からは何を使うのか見えない function renderProfile(profile) { const name = profile.name; const mail = profile.contact.email; return name + " " + mail; } // 入口で開く。1 行目が使う値の一覧になる function renderProfile({ name, contact }) { return name + " " + contact.email; }

書く文字数はほとんど変わりませんが、読み手にとっての意味が違います。後者は 1 行目を見ただけで「この関数は name と contact しか触らない」と分かります。プロフィールがキーを 7 つ 8 つ持つようになった今、これは小さくない差です。

呼び出す側にも効きます。名前付きで渡す形になるので、引数の順番を覚える必要がなくなります。引数が 3 つを超えたらオブジェクト 1 つにまとめる、という設計判断がここから生まれます。

途中の階層が無いと、そこで止まる

入れ子を開くときに必ず踏む罠がここです。

JavaScript

const profile = { name: "山田 太郎" }; const { contact: { email } } = profile; // TypeError Cannot read properties of undefined

undefined の中の email を読もうとしたので止まりました。防ぎかたは、開こうとしている階層に既定値を付けることです。

JavaScript

const { contact: { email = "未登録" } = {} } = profile; console.log(email); // 未登録

contact が無ければ空のオブジェクトを代わりに開くので、その中の email も無く、既定値が採用されます。階層ごとに受け皿を置く、と覚えてください。引数そのものが渡されないかもしれないなら、いちばん外側にも同じことをします。

JavaScript

function renderProfile({ name = "名無し", contact: { email = "未登録" } = {} } = {}) { return name + " " + email; } console.log(renderProfile()); // 名無し 未登録

名前を付け替える、配列は位置で受ける

取り出しながら改名もできます。contact: { email: mail = "未登録" } は「contact の中の email を mail という名前で受け取り、無ければ既定値」と読みます。左がキー、真ん中が変数名、後ろが既定値の順です。

配列が入っているキーは、その位置に [] を書きます。名前ではなく位置で対応するので、先頭の 1 件だけ欲しいなら 1 つだけ書けば足ります。

書きかた何が起きるか
{ name }name という変数ができる
{ name: owner }owner ができる。name はできない
{ name = "名無し" }値が undefined のときだけ既定値を使う
{ contact: { email } }email だけができる。contact はできない
{ links: [first] }配列の 0 番目が first になる
{ ... } = {}引数そのものが無いときの受け皿

既定値が使われるのは値が undefined のときだけです。null や 0 や空文字はそのまま採用されるので、null も倒したいなら開いたあとに ?? を書きます。

よくある間違い

  • 開いた親の変数を使ってしまう — { contact: { email } } は「開く指示」であって変数宣言ではないので、contact は存在しません。親も使いたいなら { contact, contact: { email } } と両方書きます
  • 受け皿を 1 か所しか置かない — 引数全体に = {} があっても、contact に付いていなければ足りません。引数が渡されていれば外側の既定値は使われず、undefined の contact を開いて落ちます
  • 付け替えと既定値の順番を逆に書く — { name = "名無し": owner } は構文エラーです。キー、変数名、既定値の順に並べます

要件

  1. 関数名は describeWork。引数は作品オブジェクト 1 つで、引数そのものが省略されることもある
  2. 引数の位置で分割代入する。title の既定値は 無題、year の既定値は 年不明
  3. stats の中の views を viewCount という名前で取り出す。既定値は 0 で、stats 自体が無くても動くようにする
  4. tags の先頭を mainTag として取り出す。既定値は 未分類 で、tags 自体が無くても動くようにする
  5. 戻り値は { label, viewCount, mainTag } のオブジェクト。label は タイトル (年) の形にする

入出力例

describeWork({"id":1,"stats":{"likes":8,"views":120},"tags":["HTML","CSS"],"title":"プロフィールサイト","year":2026}) → {"label":"プロフィールサイト (2026)","mainTag":"HTML","viewCount":120} describeWork({"id":5,"title":"学習ログ","year":2026}) → {"label":"学習ログ (2026)","mainTag":"未分類","viewCount":0} describeWork({}) → {"label":"無題 (年不明)","mainTag":"未分類","viewCount":0} describeWork() → {"label":"無題 (年不明)","mainTag":"未分類","viewCount":0} describeWork({"id":2,"stats":{"views":0},"tags":[],"title":"自己紹介カード","year":2025}) → {"label":"自己紹介カード (2025)","mainTag":"未分類","viewCount":0}

ヒント

取り出したい形をそのまま引数の位置に描きます。オブジェクトは波カッコ、配列は角カッコです。

名前の付け替えと既定値は `views: viewCount = 0` のように、キー、変数名、既定値の順で並べます。

開く階層それぞれに受け皿が要ります。stats には = {}、tags には = []、引数全体にも = {} を付けてください。

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • スプレッドとレストで組み替える

    既定値と受け取った設定を後ろ勝ちで合成し、可変個の引数をレストで配列としてまとめます。元のデータは書き換えません。

  • keys と values と entries

    オブジェクトを配列に変えて、map や filter や reduce を使えるようにする 3 つの関数です。fromEntries でオブジェクトに戻せます。

  • ビット演算でフラグをまとめる

    公開・注目・新着のような独立した設定を 1 つの数値で持ち、立てる・降ろす・切り替える・調べるを演算子で行います。

  • 第4章まとめクイズ

    分割代入の既定値、スプレッドの上書き順、レスト引数、entries と fromEntries、ビットフラグの操作をコードを読んで確かめます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 引数位置引数=順番で渡す。
  • 関数処理に名前を付けて再利用できる単位
  • 階層ネットワークを役割ごとに積み重ねた構造
  • オブジェクトキーと値のペアで構造を作るデータ
  • 設計何をどう作るかを決める前工程
  • 判断YES/NO 分岐を表す菱形
  • 配列サイズ固定の同型データの集まり
  • 変数データに名前をつけて参照する仕組み
main.js
学習モード
エディタを読み込んでいます

メモ

分割代入で必要な値だけ取り出す

⌘S で保存