変数、プロパティが定義されていない(undefined)かの判定処理を、その時々で適当いろいろな書き方をしてしまっているので、自分の中で整理してみます。
良く使う/見かけるのは、下記の3つです。
- (!x)
- (x == undefined)
- (typeof x == 'undefined')
上記はそれぞれ成立する条件が異なりますので、下記にそれぞれ記載します。
(!x)
コード一番短くて済むので多用するのですが、、
!xが成立するのは、xがundefinedの場合だけじゃなくて、多岐にわたるので使用時に注意が必要だと思います。
!xがtrueになるようなものには下記があります。
(思いつくままに挙げてみたので、これもそうだよ!!とかあったらコメントいただけると助かります)
- undefined
- null
- false
- 0
- NaN
- '' (空文字)
プロパティが存在するかどうかで、数値(Number)のプロパティに対して!xで判定するようなコードを書いてしまい、0がtrueになってしまいはまった事があります。。
(x == undefined)
コードを見て直感的にわかりやすいのと、typeofって書くのが面倒なので、これを使うのが一番多いです。
x == undefinedがtrueになるものには下記があります。
- undefined
- null
nullもtrueになるのがどうなの?って思う人もいるのかもしれませんが、nullとundefinedを区別して判定したいって状況に遭遇したことが今までなかった(逆にnullも含めてくれた方がうれしい)ので、特に違和感はありません。
追記:厳密にundefinedだけにしたいならば、型変換が行われないように(x === undefined)と書けばOKですね。
なお、、undefinedは、予約語ではなく、グローバルなオブジェクトとして宣言されており、代入可能なので、x == undefinedは使わないほうがいいのかなぁという気も最近しています。。
が、undefinedに何かを代入するようなコードがあった時点で、その代入処理自体に問題あると思うので、使っちゃまずいとも… うーん…
(typeof x == 'undefined')
x == undefinedを使ってしまうので、今まではほぼ書いたことないです。
typeof x は、 typeof(x) とも書けます。
typeof x == 'undefined'がtrueになるものには下記があります。
- undefined
x == undefinedの際と、nullの扱いが異なるところが、注意点でしょうか。
undefinedがオブジェクトなので、厳密にチェックするならば、こちらを使うべきなのかな、、と(最近)思ってます。
まとめ
場合によって使い分ければ良いと思っているのですが、一番の悩みどころは、x == undefinedを使っちゃまずいのか??ってとこです。
自分自身、このエントリを書いていて、今後は使わないようにしようかなーと思ってますが、他人が書いている部分について、それじゃまずいよ!とまで言えるようなものじゃない気がしてます。
いっそのこと、過去を捨てて、undefinedを予約語にして欲しいです。
なお、x == undefinedがダメならば、その代わりに x == null でいいんじゃない? (undefined == null が成り立つから、条件は一緒だし、nullは予約語だし)とかふと思ってしまいましたが、きっと疲れているんだと思います。
x == undefined と同じ条件式を書くならば、
(typeof x == 'undefined') || (x === null)
でしょうか。
メモ
- undefined は予約語じゃない。グローバルオブジェクトのプロパティなので代入可。
- undefined はJavaScript/1.3 以降。IE5.0以前では使えない。
- typeof はJavaScript/1.1 以降。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
修正@2008/02/06
x == undefined と同じ条件式のところを間違えていた(||のところを&&にしていた)ので修正。
通りすがりさんコメントありがとうございました。