どうも、コウイチです。
最近他の人のJavaScriptのソースを眺めていたら、こんなのを発見しました。
1 2 3 |
if(!!obj){ } |
↑これ
ビックリマーク2つ(!!)を使ってます。
あんまり見かけない珍しい書き方だったので、
ちょっと調べてみました。
ビックリマーク1つ(!)否定の論理演算子
まず、ビックリマーク1つ(!)は、否定の論理演算子です。
1 2 3 4 5 6 7 8 9 |
if(!true){ alert("trueです。"); }else{ alert("falseです。"); } |
実行結果:falseです。
ビックリマーク2つ(!!)二重否定の論理演算子
ビックリマーク2つ(!!)は、二重否定の論理演算子です。
1 2 3 4 5 6 7 8 9 |
if(!!true){ alert("trueです。"); }else{ alert("falseです。"); } |
実行結果:trueです。
二重に否定するので、trueがfalseになり、そのfalseがtrueに戻ります。
なら何の意味があるのか?と思いますよね。
!!を使うわけ
では、こんな例はどうでしょうか。
1 2 3 4 5 6 |
var aaa; if(aaa){ alert("変数aaaの値は、" + aaa + "です。"); }else{ alert("変数aaaは定義されていません。"); } |
未定義の変数はundefined(未定義)が返り、それはfalse扱いなので、上のコードで問題は起きません。
(var aaa;を入れないとエラーになりました。)
しかし、undefined(未定義)というキーワードに未対応の古いブラウザが存在するみたいです。(;゚Д゚)
古い環境では、undefined(未定義)というキーワードが存在せず、未定義の変数がifの条件式の中でboolean型に変換されないため、if文がエラーになってしまう可能性があるのですね。
if(○○○)の中身はboolean型(trueかfalse)にならなければなりません。
1 2 3 4 5 6 |
var aaa; if(!!aaa){ // 今の環境ではこんなことをする必要はない alert("変数aaaの値は、" + aaa + "です。"); }else{ alert("変数aaaは定義されていません"); } |
そこで、変数が未定義でも、if文の条件式の中をboolean型にする必要があります。
否定演算子(!)は、対象のオブジェクトの否定をboolean型で返す性質があるので、
一旦否定演算子(!)でaaaを逆の真偽値としてboolean型に変換し、もう一度(!)を使って元の真偽値(boolean型)に戻します。
これによって、未定義の変数もif文の条件式の中でboolean型になるため、正しく判定ができます。
最後に
自分じゃ全く使わない書き方だったので、
戸惑いました(汗
他人のコードを見るときなんか、結構出てくるので、是非覚えておきましょう。
ありがとうございました。
コメント