[Javascript] `undefined`な変数/引数/プロパティ/戻り値 と例外発生の愉快な挙動

挙動をまとめると

  • 変数を定義すれば undefined でも例外とばない(ローカル変数も同じ)
  • 関数の戻り値が undefined でも例外とばない
  • 未定義のグローバル変数へのアクセスは例外が飛ぶ
  • 未定義のプロパティにアクセスしても例外とばない
  • 未定義プロパティのプロパティへのアクセスは例外が飛ぶ
  • typeof を利用すると例外を飛ばさずに undefined かどうかを知ることが可能

サンプルコード

// 変数を定義すれば undefined でも例外とばない(ローカル変数も同じ)
var a;
alert("a = " + a); // a = undefined

// 引数で定義されていれば undefined でも例外とばない
function c(b) {
  alert("b = " + b); // b = undefined
  return b;
}

// 関数の戻り値が undefined でも例外とばない
alert("c = " + c()); // c = undefined
alert("d = " + window.d); // d = undefined

try {
  // 未定義のグローバル変数へのアクセスは例外が飛ぶ
  alert(e); // アラートは実行されない
} catch(error) {
  // e error = ReferenceError: 'e' は定義されていません。
  alert("e error = " + error);
}

try {
  // 未定義のプロパティにアクセスしても例外とばないけど
  if ( ! window.f ) {
    // 未定義プロパティのプロパティは例外が飛ぶ
    alert(window.hoge.f); // アラートは実行されない
  }
} catch(error) {
  // f error = TypeError: 未定義または NULL 参照のプロパティ 'f' は取得できません
  alert("f error = " + error);
}

// typeof を利用すると例外を飛ばさずに undefined かどうかを知ることが可能
if (typeof g == "undefined") {
  alert("g = " + window.g); // g = undefined
}
Share
関連記事