Code Fix

中級

配列の分割代入で要素が足りないとundefinedになる(デフォルト値の付け方)

配列の分割代入で、元の配列より多い変数を用意すると、対応する要素が無い変数はundefinedになります。各変数にデフォルト値を指定することでこれを防げます。

なぜエラーが出ないのか

出力: undefined
(エラーなし)
JavaScriptは何も報告しません。文法として正しいためです
出力: undefined
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  const [first, second, third     ] = [1, 2];
                                  ^
 2  console.log(third);
出力: undefined期待: 0 (エラーにはなりません)

配列に対応する要素が無い変数はundefinedになります。分割代入の変数にデフォルト値を指定すれば、要素が無いときだけその値が使われます。

直し方: (空) を = 0 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  const [x, y, z      ] = [10, 20];
                     ^
 2  console.log(z);
出力: undefined期待: -1 (エラーにはなりません)

zに対応する3番目の要素は元の配列に存在しません。デフォルト値を付けなければundefinedのままです。

直し方: (空) を = -1 にします。

この問題を解いてみる →

パターン3

 1  const [a, b, c          ] = ["x", "y"];
                       ^
 2  console.log(c);
出力: undefined期待: none (エラーにはなりません)

cに対応する要素が元の配列にないため、デフォルト値を指定しない限りundefinedになります。

直し方: (空) を = "none" にします。

この問題を解いてみる →

パターン4

 1  const [name, age, country        ] = ["Al", 20];
                                 ^
 2  console.log(country);
出力: undefined期待: JP (エラーにはなりません)

countryに対応する3番目の要素は元の配列にありません。デフォルト値を付けないとundefinedのままです。

直し方: (空) を = "JP" にします。

この問題を解いてみる →

パターン5

 1  const [w, h, depth     ] = [100, 50];
                         ^
 2  console.log(depth);
出力: undefined期待: 1 (エラーにはなりません)

depthに対応する要素が無いため、デフォルト値を指定しなければundefinedになります。

直し方: (空) を = 1 にします。

この問題を解いてみる →

よくある誤解

「変数の数だけ自動で埋めてくれるはず」という思い込みは誤りです。元の配列に対応する要素が無ければ、デフォルト値を指定しない限りundefinedがそのまま入ります。

実務での勘所

デフォルト値には、同じ分割代入パターンの中で先に取り出した変数を参照する式も書けます。const [a, b = a * 2] = [5]のように書くと、bに対応する要素が無いためデフォルト値a * 2が評価され、bは10になります。この参照は、対応する要素が実際に無かった(undefinedだった)ときだけ評価されるため、[5, 100]のように2番目の要素があれば、a * 2という式自体が評価されずdは100のままになります。デフォルト値は単なる固定値だけでなく、その場で計算する式を書けるという柔軟性を持っています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)