【すぷれっどこうぶん】

スプレッド構文 とは?

💡 配列やオブジェクトを「バラバラにして広げる」魔法の3点リーダー
📌 このページのポイント
スプレッド演算子(...)の展開イメージ 配列の展開 [1, 2, 3] ... 1 2 3 オブジェクトの展開 {"{a:1, b:2}"} ... a:1 b:2 配列の結合例 [1, 2] + [3, 4] = [...a, ...b] → [1, 2, 3, 4] 配列やオブジェクトの要素を個別に展開して、結合やコピーに使う
スプレッド演算子のイメージ
ひよこ ひよこ

スプレッド構文ってどんなときに使うの?

ペンギン先生 ペンギン先生

たとえば2つの配列を合体させたいとき。従来は「arr1.concat(arr2)」と書いていたのが、スプレッド構文なら「[...arr1, ...arr2]」で済むんだ。オブジェクトのコピーも「{...obj}」で簡単にできる。中身を「バラバラにして広げる」イメージだよ。

ひよこ ひよこ

オブジェクトの一部だけ変えたいときにも使えるの?

ペンギン先生 ペンギン先生

まさにそれが得意技だよ!「{...user, name: '新しい名前'}」と書くと、元のuserオブジェクトはそのままで、nameだけ変更した新しいオブジェクトが作れるんだ。元のデータを壊さない「イミュータブル」な書き方で、ReactのState管理なんかで大活躍するよ。

ひよこ ひよこ

スプレッド構文で気をつけることってある?

ペンギン先生 ペンギン先生

一番のハマりポイントは「浅いコピーシャローコピー)」しかできないことだよ。オブジェクトの中にさらにオブジェクトがある場合、内側のオブジェクトは参照がコピーされるだけで実体は共有されたままなんだ。深い階層のデータを完全にコピーしたいときはstructuredClone()を使うか、ライブラリの力を借りる必要があるよ。

ひよこ ひよこ

レスト構文(...)とスプレッド構文って同じ記号だけど、どう違うの?

ペンギン先生 ペンギン先生

見た目は同じ「...」だけど、使う場所で意味が逆になるんだ。スプレッド構文は「展開(バラバラにする)」、レスト構文は「集約(まとめる)」だよ。たとえばconst [first, ...rest] = [1,2,3]のようにレストパラメータで使うと、firstに1が入り、restに[2,3]がまとまる。関数の引数でもfunction sum(...nums)のように使えるよ。

ひよこ ひよこ

パフォーマンスの問題ってあるの?

ペンギン先生 ペンギン先生

大きなオブジェクト配列を毎回スプレッドするとコピーコストがかかるよ。Reactで状態更新のたびに巨大なオブジェクトを{...state}するのは非効率。そういう場合はimmerライブラリを使うと内部的に構造共有して効率よく更新できる。また、配列の結合で[...arr1, ...arr2]よりarr1.concat(arr2)の方が大量データでは速い場合もある。パフォーマンスが問題になったら計測して判断しようね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スプレッド構文」って出てきたら「配列オブジェクトの中身をバラして展開するJavaScriptの書き方だな」と思えればだいたいOK!
📖 おまけ:英語の意味
「spread syntax」 = 広げる構文
💬 spreadは「広げる・まき散らす」という意味。中身を広げて展開するイメージだよ
← 用語集にもどる