JavaScriptでは、初期化されていない変数にundefined
という値が入る。こいつがちょっと特殊な挙動をとるため、判定方法を備忘録としてまとめておく。
思いついたり調べたりした6パターン
1. a === undefined
jsでは、グローバル変数undefined
が用意されている(中身はもちろんundefined
)ため、これで比較できる。ただし、undefined
は単なる変数。やろうと思えばこういうこともできる。
undefined = "hoge";
var a;
if (a === undefined) {
// こっちにはこない
} else {
// 条件式は、「undefined === "hoge"」となり、falseになる
alert("aはundefinedじゃない???")
}
undefined
を上書きすることなんてないと信じたいが、バグの元になりそうなので、このやり方はやめたほうが良いかも。
まぁESとか使ってたら、変更するなと文句は言われる。
ES6ならこんなエラー。
Read-only global 'undefined' should not be modified
2. typeof a === “undefied“
typeof
を使うやり方。undefined
値にtypeof
演算子を使うと必ず"undefined"
という文字列が返るため、それと比較する。
if (typeof a === "undefined") {
alert("aはundefined");
}
ググるとこのやり方をしていることが多いように見えた。
3.そのままBooleanとして判定する
undefined
値をそのままif
文に打ち込むと、常にfalse
を返す。これを利用する。
ただし、false
を返すのはundefined
値だけではない点に注意。0
とかnull
とかもfalse
を返す。
if (!a) { // !を使うとundefinedの時、trueを返す
alert("aはfalseか0かnullかundefinedか…");
}
「undefined
を判定したい」ってときには、あんまり使うことなさそう。
なんかよく分からんけど、想定外の値をまとめて判定したいってんなら使えるかも?
4. == nullで代用する
nullはundefinedと違って予約語。nullはいつでもnull。
3と同じく、完全な判定には使えないが、多少は厳密。実際、null
とundefied
を区別する必要がある場合なんてほとんどないので、使えそう。
if (a == null) {
alert("aはundefinedかnull");
}
===
を使わず==
を使っているのがポイントだが、個人的には、それが気持ち悪くてしょうがない。
5. void 0と比較する
void
はあらゆる値に作用し、常にundefined
を返す。そのため、別にvoid 100
でもvoid ""
でも何でもいいが、慣習的に0が使われることが多いよう。
if (a === void 0) {
alert("aはundefined");
}
安全そうだが、個人的には可読性悪いように思える。JS独特の書き方だし、ちょっと気持ち悪い。
6. 自分でundefinedを定義してしまう
jQueryが採用している方式。undefined
が予約語でないのが全ての元凶なのだから、自分で定義すればええやんってやつ。
(function(undefined){
//このブロック内では確実にundefinedはundefined値が入っている
if (a === undefined) {
alert("aはundefined");
}
})();
これはこれで(私にとっては)気持ち悪いが、可読性は悪くないし、安全。あとは、好み。
まとめ
割と好みの問題かも。
チーム開発であればコーディング規約的に決めておいた方が良さそう。同じundefined
値の比較をいろんな方法でやってるコードとか読みたくない。