どちらも ... を使いますが、逆方向 に働きます。spread はコレクションを個々の要素に展開し、rest は要素を1つの配列/オブジェクトに集約します。
Spread — 展開
js
a = [, ], b = [, ];
merged = [...a, ...b];
copy = [...a];
obj = { ...user, : };
.(...[, , ]);
どちらも ... を使いますが、逆方向 に働きます。spread はコレクションを個々の要素に展開し、rest は要素を1つの配列/オブジェクトに集約します。
a = [, ], b = [, ];
merged = [...a, ...b];
copy = [...a];
obj = { ...user, : };
.(...[, , ]);
function sum(...nums) { // gather all args into an array
return nums.reduce((a, n) => a + n, 0);
}
sum(1, 2, 3); // 6
const [first, ...others] = [10, 20, 30]; // first=10, others=[20, 30]
const { id, ...rest } = user; // pull out id, keep the rest
const original = { user: { name: "Ann" } };
const copy = { ...original };
copy.user.name = "Bob"; // ⚠️ also changes original.user.name — nested object is SHARED
Spread はトップレベルだけをコピーし、ネストしたオブジェクトは依然として共有された参照のままです。状態の更新では通常トップレベルだけを変更するので問題ありませんが、深い構造では注意が必要です。
Spread は React/Redux で イミュータブルな更新(コピー+変更)を行う標準的な方法であり、rest は可変長引数の関数や「残りを取り出す」分割代入をきれいに書けるようにします。