二重論理否定

よくif文などに用いられる判定文で、!!という論理否定を二重にしたステートメントに出くわすことがある。 具体的には次のようなコードだ。


if(!!obj)//objがundefinedでないときの処理

なぜこのようなことが必要なのか? 通常undefinedであればfalseが返るはずであり、単純にif(obj)でいいのではないだろうか?

実はundefinedfalseに変換しない古いブラウザやバグのあるブラウザなどに対処するために、わざわざこのようなことをしているようだ。 undefinedというプリミティヴ値自体がJavaScript1.3から定義されるようになったものであり、 古いブラウザやMac+IE5なんかだと単なるif(obj)という式自体がエラーになってしまうらしい。

よく海外の古いソースコードを見ていると、変数にfalseになるような値を代入して初期化しているのを見かけるのも同様の理由によるものであろう。 オブジェクトの判定に使う変数にはfalseを代入し、数値を代入する変数には0を代入し、文字列を代入する変数には空文字列("")を代入しているものが結構ある。 これによってif(hensu)という形で心置きなく判定に使えるというわけだ。