技術メモのかけら

内容はもとより調べたことすら忘れてしまうので個人的な技術メモを残しているブログです。Qiitaの記事にするほどでもない細かいネタを投稿します。

undefinedの判定方法

undefinedは次の場所に現れる。

  • 初期化していない変数の値
  • 未定義のプロパティの値
  • 渡されなかった関数の仮引数の値
  • return文がない、またはreturn文に式がない場合の関数の戻り値
  • void演算子の結果

undefinedかを判定する方法について少し調べたので自分なりにメリット/デメリットをまとめてみる。

1.undefinedと比較する方法

console.log(a === undefined);

undefined予約語でも何でもなく、処理系が定義したグローバル変数のため、 上書きされている可能性も無きにしもあらずのため推奨されないようです。
ただECMAScript第5版から読込専用となったので、モダンブラウザでは上書きできないものが多いようです。

以前は処理系によっては宣言されてなかったり、上書きもできたので、初期のjQueryはグローバルに宣言してたようです。

// Global undefined variable
window.undefined = window.undefined;

初見では何したいのか分かりませんでしたが。

2.typeof で判定する方法

console.log(typeof a === "undefined");

typeof全般そうだが、文字列と比較するのがイケてない気がする。
宣言すらされていない変数名をtypeofに渡してもReferenceErrorにならない副産物もあり。

3.void と比較する方法

console.log(a === void 0);

voidはundefined を返す特性を利用する方法。
ちょっとトリッキーな気がする。

4.ローカル変数undefinedと比較する方法

function() {
  var undefined;
  console.log(a === undefined);
}

グローバル変数よりローカル変数の方が先にアクセスされるので、ローカル変数に定義してしまう方法。
毎度毎度、ローカル変数を宣言するのは面倒な気がする。

5. booleanで判定する nullや0、falseと区別がつかなくが、それでも良い場合に。

var a;
if (!a)
  console.log("undefined");

仕事で使う場合でターゲットブラウザがはっきりしていて教条主義にならないなら1の方法で良い気がする。
2~3を使うなら独自にisUndefinedみたいなヘルパーを作るかな。