undefined

変数、プロパティが定義されていない(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 と同じ条件式のところを間違えていた(||のところを&&にしていた)ので修正。
通りすがりさんコメントありがとうございました。