【JavaScript】配列の分割代入(デストラクチャリング)をわかりやすく解説!

この記事では『配列の分割代入』について

  • 配列の分割代入(デストラクチャリング)とは
  • 配列の分割代入の特徴
    • 全ての要素を代入する必要はない
    • 宣言済みの変数に対しても代入可能
    • デフォルト値を設定可能
    • スプレッド演算子(…)と合わせることが可能
    • 関数の引数にも、配列の分割代入を利用可能

などを図を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

【JavaScript】配列の分割代入(デストラクチャリング)とは

配列の分割代入を用いると、配列の各要素を別々の変数に一度に代入することができます。

一例として、以下のプログラムを見てみましょう。

let arr = [1, 2, 3];

let [first, second, third] = arr;

console.log(first);     // 1 が表示
console.log(second);    // 2 が表示
console.log(third);     // 3 が表示

上記のプログラムでは、first, second ,thirdという変数に対して、配列arrの各要素を代入しています。

このように、角括弧[]の中に変数をコンマ区切りで並べることによって、配列の各要素を代入することができます。

分割代入を用いない場合には、以下のように記述します。

let arr = [1, 2, 3];

let first = arr[0];
let second = arr[1];
let third = arr[2];

console.log(first);     // 1 が表示
console.log(second);    // 2 が表示
console.log(third);     // 3 が表示

見比べてみると、「配列の分割代入」によって、配列arrを何回も記述する必要がなくなっていることがわかります。

また、「配列の分割代入」には以下の特徴があります。

「配列の分割代入」の特徴

  • 全ての要素を代入する必要はない
  • 宣言済みの変数に対しても代入可能
  • デフォルト値を設定可能
  • スプレッド演算子(…)と合わせることが可能
  • 関数の引数にも、配列の分割代入を利用可能

各特長について順番に説明します。

補足

分割代入は英語では「Destructuring assignment」と書きます。

全ての要素を代入する必要はない

例えば、1つ目の要素と2つ目の要素だけを代入したい場合には、以下のように記述します。以下のプログラムでは、first, secondという変数名に対して、配列arrの各要素を代入しています。

let arr = [1, 2, 3];

let [first, second,] = arr;
//カンマ(,)を無くしても良い。
//let [first, second] = arr;

console.log(first);     // 1 が表示
console.log(second);    // 2 が表示

このように、「配列の長さ(3)」と「各括弧[]内の変数の長さ(2)」が一致しなくても構いません。通常は「各括弧[]内の変数の長さ」の方が短くなるように使います。

1つ目の要素と3つ目の要素だけを代入したい場合には、以下のように記述します。以下のプログラムでは、first, thirdという変数名に対して、配列arrの各要素を代入しています。

let arr = [1, 2, 3];

let [first, , third] = arr;

console.log(first);     // 1 が表示
console.log(third);     // 3 が表示

2つ目の要素と3つ目の要素だけを代入したい場合には、以下のように記述します。以下のプログラムでは、second, thirdという変数名に対して、配列arrの各要素を代入しています。

let arr = [1, 2, 3];

let [, second, third] = arr;

console.log(second);    // 2 が表示
console.log(third);     // 3 が表示

このように、不要な要素を空白にすることで、配列の代入をスキップすることができます。

なお、「各括弧[]内の変数の長さ」が「配列の長さ」よりも長い場合、変数が「undefined」となってしまいます。以下のプログラムは、「各括弧[]内の変数の長さ(4)」が「配列の長さ(3)」よりも長いプログラムの一例です。

let arr = [1, 2, 3];

let [first, second, third, fourth] = arr;

console.log(first);     // 1 が表示
console.log(second);    // 2 が表示
console.log(third);     // 3 が表示
console.log(fourth);    // undefined が表示

宣言済みの変数に対しても代入可能

以下のプログラムでは、宣言済みの変数xに対して、配列の1つ目の要素を代入しています。

let x;
let arr = [1, 2, 3];

[x, ,] = arr;
//カンマ(,)を無くしても良い。
//[x] = arr;

console.log(x);     // 1 が表示

デフォルト値を設定可能

以下のプログラムでは、first, second ,thirdという変数名に対して、配列arrの各要素を代入しています。また、変数forthに対して、デフォルト値「4」を代入しています。

let arr = [1, 2, 3];

let [first, second, third, fourth = 4] = arr;

console.log(first);     // 1 が表示
console.log(second);    // 2 が表示
console.log(third);     // 3 が表示
console.log(fourth);    // 4 が表示

スプレッド演算子(…)と合わせることが可能

以下のプログラムでは、スプレッド演算子(…)と合わせて、配列の分割代入をしています。配列restには「…rest」の位置以降にある配列arrの全ての要素が代入されます。

プログラム例1

let arr = [1, 2, 3];

let [first, ...rest] = arr;

console.log(first);   // 1 が表示
console.log(rest);    // [ 2, 3 ] が表示

プログラム例2

let arr = [1, 2, 3, 4, 5];

let [first, , ...rest] = arr;

console.log(first);   // 1 が表示
console.log(rest);    // [ 3, 4, 5 ] が表示

なお、角括弧[]内の最後の要素のみに「スプレッド演算子(…)」を用いることができます。そのため、以下のプログラムはNGです。

ダメなプログラム例

let arr = [1, 2, 3];

let [...rest, third] = arr;

console.log(rest); 
console.log(third); 

関数の引数にも、配列の分割代入を利用可能

以下のプログラムのように、関数の引数にも配列の分割代入が利用できます。

関数宣言を用いた場合

let arr = [1, 2, 3];

function showElements([first, second, third]) {
    console.log(first);
    console.log(second);
    console.log(third);
}

showElements(arr);

//ログ:
// 1
// 2
// 3

関数式を用いた場合

let arr = [1, 2, 3];

const showElements = function ([first, second, third]) {
    console.log(first);
    console.log(second);
    console.log(third);
}

showElements(arr);

//ログ:
// 1
// 2
// 3

アロー関数を用いた場合

let arr = [1, 2, 3];

const showElements = ([first, second, third]) => {
    console.log(first);
    console.log(second);
    console.log(third);
}

showElements(arr);

//ログ:
// 1
// 2
// 3

本記事のまとめ

この記事では『配列の分割代入』について、以下の内容を説明しました。

  • 配列の分割代入(デストラクチャリング)とは
  • 配列の分割代入の特徴
    • 全ての要素を代入する必要はない
    • 宣言済みの変数に対しても代入可能
    • デフォルト値を設定可能
    • スプレッド演算子(…)と合わせることが可能
    • 関数の引数にも、配列の分割代入を利用可能

お読み頂きありがとうございました。