💨

【JavaScript】レスト構文、スプレッド構文

に公開

レスト構文

  • 配列の最初の要素だけ別の定数/変数にして、残りを配列にする分割代入する書き方
  • 左辺でドット3つが使用されている分割代入
const scores = [65, 37, 85, 69, 94];
const [first, ...others] = scores; // ドット3つを使った分割代入。

console.log(first); // 65
console.log(others); // [37, 85, 69, 94] ドット3つの後の文字列が定数名

スプレッド構文

  • 右辺で使われる。要素を取り出して広げるための構文
const addScores = [99, 88];

const scores = [65, 37, 85, 69, 94, addScores]; // [65, 37, 85, 69, 94, [99, 88]]と、配列の中に配列ができてしまう]
const scores = [65, 37, 85, 69, 94, ...addScores]; // [65, 37, 85, 69, 94, 99, 88]と、並べることができる

console.log(scores);

const arr1 = [10, 20];
const arr2 = [30, 40];
const arr3 = [...arr1]; // 配列のコピー
const arr3 = [...arr1, ...arr2]; // まとめる

オブジェクトでの分割代入、レスト構文、スプレッド構文の動き

const scores = {
    a: 38,
    b: 90,
    c: 45,
};
const {a, b, c} = scores; // オブジェクトの場合、波括弧を使った分割代入。それぞれのキーの値を定数に代入
const scores = {
    a: 38,
    b: 90,
    c: 45,
};
const {a, ...others} = scores; // レスト構文
console.log(a); // 38
console.log(others); // {b: 90, c: 45} 残りはオブジェクト
const addScores = {
    d: 138,
    e: 290,
};

const scores = {
    a: 38,
    b: 90,
    c: 45,
    // addScores, // 配列の中に配列が入る
    ...addScores, // スプレッド構文。要素が取り出されて同じ配列に並ぶ
};

スプレッド構文を使ったコピー

  • 配列/オブジェクトの場合、定数/変数に代入すると、参照することがコピーされるだけで、値自体がコピーされるわけではないので挙動に注意が必要
  • 値自体をコピーするには、スプレッド構文を使う
const scores = [65, 37, 85];
const scoresBackup = scores; // これだと、参照することがコピーされただけ
const scoresBackup = [65, 37, 85]; // これだと、重複。保守性も良くない
const scoresBackup = [...scores]; // スプレッド構文

scores[0] = 99;
console.log(scores); // [99, 37, 85]
console.log(scoresBackup); // [65, 37, 85]

Discussion