[JavaScript] undefinedの問題とその解決法
基本
undefinedは、グローバル変数。nullのようなキーワードではないので、代入できてしまう。
undefined = 1;
困ったことに、undefined変数は値としてのudefinedを示しているとは限らない。
対策
いずれの場合も、暗黙的な型変換を避けるために、厳密な比較演算子「===」を使ったほうがいい。
typeof演算子を使う
typeof sample === "undefined"
メリット
一番オーソドックスで確実。
デメリット
- いちいち「typeof ~」と書くのはめんどくさい(エディタの入力補完がきかない)。
- 文字列リテラル「"undefined"」の書き間違いが起きやすい。
- 型のチェックをしてから文字列の比較をするので、やや処理が遅い。
使わないローカル変数をあえて宣言する
変数名はなんでもいい。
var undef; sample === undef alert(undef); // undefined
メリット
- シンプルでわかりやすい。
- あくまでローカル変数なので処理が速い。
デメリット
間違って代入してしまうと問題。「undef = 1;」
関数の使わない引数をあえて宣言する
function doSample(param, undef) { sample === undef } doSample(1);
メリット
ローカル変数扱いなので処理が速い。
デメリット
ローカル変数の場合と同じく、間違って代入したり、「doSample(1, 2)」と引数を指定してしまったりすると問題。
確実にundefined値を返す関数をつくる
function undef() { var u; return u; }
メリット
記述が一度きりでいい。
デメリット
- 関数呼び出しの分、処理コストがかかる。
- ローカル変数の場合と同じく、「undef = 1」などとして関数そのものを上書きしてしまったら意味がない。
まとめ
typeofを除き、どのやり方も使う変数に別の値を代入してしまったら意味がない。
そもそも、グローバル変数のundefinedが上書きされるリスクがあるから上記のようなトリックが必要なのだが、それらも結局は書き間違えたり、上書きされたりするという似たようなリスクがある。
ならば、最初からグローバル変数のundefinedを使えばいい気がする。そのほうが、初心者にもわかりやすい。