1. 空の配列に足すと既定値が入る
  2. newWork の views が既定値を上書きする
  3. published も上書きできる
  4. 空オブジェクトを足すと既定値だけが残る
コース一覧
JavaScript基礎文法:処理を組み立てる
スプレッド構文

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

スプレッド構文

スプレッドと push
解説

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

  • ... は配列やオブジェクトの中身をその場にばらまく記号です
  • オブジェクトを合成すると、後に書いたキーが勝ちます

渡しただけなのに、呼び出し元の配列が増えている

前のレッスンで確かめたとおり、push は受け取った配列そのものを書き換えます。関数の中で push すると、呼び出した側の配列まで一緒に変わります。

JavaScript

const original = ["HTML", "CSS"]; const updated = original; updated.push("JavaScript"); console.log(original.length); // 3 元も増えている

呼び出し側から見れば「渡しただけなのに壊された」わけです。こうした書き換えは、規模が大きくなるほど原因の特定が難しいバグになります。分割代入が値を取り出す道具だったのに対して、スプレッド構文は中身をばらまいて新しく作り直す道具です。

JavaScript

const skills = ["HTML", "CSS"]; console.log([...skills, "JavaScript"]); // ["HTML", "CSS", "JavaScript"] console.log(skills.length); // 2 元はそのまま

...skills は「skills の中身をこの場にばらまく」という意味です。新しい [] の中でばらまいて後ろに 1 つ置けば、元を触らずに要素が 1 つ増えた別の配列ができあがります。

やりたいこと書き方元の配列
コピー[...arr]変わらない
末尾に追加[...arr, x]変わらない
先頭に追加[x, ...arr]変わらない
末尾に追加 (破壊的)arr.push(x)変わる
解説

元のデータを書き換えず、新しいデータを作る書き方をイミュータブルな更新と呼びます。React をはじめとする現代のフレームワークは、この前提で変化を検知しています。

{} の中では、後に書いたほうが勝つ

オブジェクトでも同じ記号が使えます。こちらはキーが重なったときの挙動が要点です。

JavaScript

const defaults = { theme: "light", fontSize: 16 }; const saved = { theme: "dark" }; console.log({ ...defaults, ...saved }); // { theme: "dark", fontSize: 16 }

同じキーがあれば、後に書いたほうが勝ちます。この性質を使うと「既定値を先に置き、実際の値で上書きする」という定石が書けます。順番を逆にすると既定値のほうが勝ってしまうので、並べる順序はとても重要です。{ ...defaults, fontSize: 20 } のように、1 つのキーだけ差し替えた新しいオブジェクトを作るのも同じ形です。

コピーは一段だけ

ここがこのレッスンでいちばん大事なところです。... で作られるコピーは浅いコピーです。

JavaScript

const config = { theme: "dark", editor: { tabSize: 2 } }; const copy = { ...config }; copy.theme = "light"; console.log(config.theme); // dark こちらは無事 copy.editor.tabSize = 4; console.log(config.editor.tabSize); // 4 こちらは道連れ

1 階層目は新しく作られますが、値がオブジェクトや配列なら、その実体は元と共有されたままです。前のレッスンの「同じ場所を指す 2 枚の札」がそのまま残っている状態です。深いところまで分けたいなら、階層ごとに重ねます。

JavaScript

const deep = { ...config, editor: { ...config.editor } };

よくある間違い

  • 合成の順番を逆にする — 既定値を後ろに置くと、実際の値が既定値で上書きされます。既定値は必ず先に置きます
  • オブジェクトを [] で展開する — [...config] は config is not iterable で止まります。[] の中で展開できるのは配列や文字列などで、オブジェクトを展開するなら {} の中で行います

要件

  1. 関数名は withNewWork、引数は works と newWork の 2 つ
  2. { views: 0, published: false } を既定値として newWork とマージすること
  3. 戻り値は元の配列に手を加えずに作った新しい配列
  4. push を使わずスプレッド構文で書くこと

入出力例

withNewWork([], {"title":"プロフィールサイト","year":2026}) → [{"published":false,"title":"プロフィールサイト","views":0,"year":2026}] withNewWork([{"published":true,"title":"プロフィールサイト","views":120,"year":2026}], {"title":"自己紹介カード","views":80,"year":2026}) → [{"published":true,"title":"プロフィールサイト","views":120,"year":2026},{"published":false,"title":"自己紹介カード","views":80,"year":2026}] withNewWork([{"published":true,"title":"プロフィールサイト","views":120,"year":2026},{"published":false,"title":"自己紹介カード","views":80,"year":2026}], {"published":true,"title":"スキル一覧の表","year":2026}) → [{"published":true,"title":"プロフィールサイト","views":120,"year":2026},{"published":false,"title":"自己紹介カード","views":80,"year":2026},{"published":true,"title":"スキル一覧の表","views":0,"year":2026}] withNewWork([], {}) → [{"published":false,"views":0}]

ヒント

マージは `{ views: 0, published: false, ...newWork }` です。既定値を先に書くのがポイントです

配列に足すのは `[...works, filled]` です。新しい配列リテラルの中に展開します

順番を逆にして `{ ...newWork, views: 0 }` と書くと、渡された値が既定値で上書きされてしまいます

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

関連レッスン

  • find と includes で探す

    配列から条件に合う要素を探す道具です。値が欲しいのか位置が欲しいのか有無だけでよいのかで使い分けます。

  • つくる 作品データを構造化する

    第 7 章の総仕上げです。作品オブジェクトの配列から件数と合計閲覧数と最新作をまとめた集計結果を返します。

  • 第4章まとめクイズ

    オブジェクトの作り方と読み方から、参照・分割代入・スプレッド・検索まで、第7章で扱った内容を 5 問で確かめます。

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

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

  • 配列サイズ固定の同型データの集まり
  • オブジェクトキーと値のペアで構造を作るデータ
  • 関数処理に名前を付けて再利用できる単位
  • スプレッド...で配列・オブジェクトを展開する
  • スプレッド構文...で展開・コピーを表す記法
  • イミュータブル既存データを書き換えず新しい値を作る方針
  • ミュータブルミュータブル=変更可能(リスト、辞書、セット)。
  • 階層ネットワークを役割ごとに積み重ねた構造
main.js
学習モード
エディタを読み込んでいます

メモ

スプレッド構文

⌘S で保存