ご存知の通り、JavaScriptには等価演算子(==
)と厳密等価演算子(===
)が存在します。
JavaScript The Good Partsなどで言及されてたり、JSLintやJSHintなどの静的コードチェッカーで怒られてしまったりするようにJavaScriptの場合は勝手に型を変換してしまい、意図しない結果が返ってきたり、そもそも型変換のコストがかかるために基本的には厳密等価演算子を使用して比較することが良いとされていますね。
しかし、jQueryのJavaScript Style Guideというcontributor向けのガイドラインの Equality の部分に以下のような記述があります。
Strict equality checks (===) should be used in favor of ==. The only exception is when checking for undefined and null by way of null.
下のコードのようにundefined
とnull
をどちらもチェックする場合にのみ==
を使用していいというルールになっています。
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
実際にjQueryのコードを見てもこんな感じに使われています。
undefined
とnull
はもちろん別物なのに、何で上記のようなコードでどちらも判別されるの?と思いますがこれは「仕様です」としか言えないシロモノです。
ECMAScriptの11.9.3の項目を見てみると以下のような仕様であることが分かります。
// 以下の場合にtrueを返す
null == null
undefined == undefined
null == undefined
undefined == null
上記の仕様でいうと比較するものとしてはundefined
でもnull
でもどっちでも良いように思いますが、実際のところundefined
というキーワードは予約語ではないので、もしかしたらどこかで書き変えられてる可能性もあるので、予約語であるnull
を使って比較してる形です。
ということで、undefined
とnull
どちらでも良いけど、ちゃんと値が入ってるかをチェックしたい場合にのみ等価演算子を使用すると記述が簡単になりますね。
他のケースではCoffeeScriptなどを使うなり、JSLintやJSHintを使うなりして、厳密等価演算子を書くクセを付けたほうが良いと思います。