【JavaScript】!!(ビックリマーク2つ)って何?

プログラミング

どうも、コウイチです。

最近他の人のJavaScriptのソースを眺めていたら、こんなのを発見しました。

if(!!obj){

}

↑これ

ビックリマーク2つ(!!)を使ってます。

あんまり見かけない珍しい書き方だったので、

ちょっと調べてみました。

ビックリマーク1つ(!)否定の論理演算子

まず、ビックリマーク1つ(!)は、否定の論理演算子です。

if(!true){

    alert("trueです。");

}else{

    alert("falseです。");

}

実行結果:falseです。

ビックリマーク2つ(!!)二重否定の論理演算子

ビックリマーク2つ(!!)は、二重否定の論理演算子です。

if(!!true){

    alert("trueです。");

}else{

    alert("falseです。");

}

実行結果:trueです。

二重に否定するので、trueがfalseになり、そのfalseがtrueに戻ります。

なら何の意味があるのか?と思いますよね。

!!を使うわけ

では、こんな例はどうでしょうか。

var aaa;
if(aaa){
 alert("変数aaaの値は、" + aaa + "です。");
}else{
 alert("変数aaaは定義されていません。");
}

未定義の変数はundefined(未定義)が返り、それはfalse扱いなので、上のコードで問題は起きません。

(var aaa;を入れないとエラーになりました。)

 

しかし、undefined(未定義)というキーワードに未対応の古いブラウザが存在するみたいです。(;゚Д゚)

古い環境では、undefined(未定義)というキーワードが存在せず、未定義の変数がifの条件式の中でboolean型に変換されないため、if文がエラーになってしまう可能性があるのですね。

 

if(○○○)の中身はboolean型(trueかfalse)にならなければなりません。

 

var aaa;
if(!!aaa){ // 今の環境ではこんなことをする必要はない
 alert("変数aaaの値は、" + aaa + "です。");
}else{
 alert("変数aaaは定義されていません");
}

そこで、変数が未定義でも、if文の条件式の中をboolean型にする必要があります。

 

否定演算子(!)は、対象のオブジェクトの否定をboolean型で返す性質があるので、

一旦否定演算子(!)でaaaを逆の真偽値としてboolean型に変換し、もう一度(!)を使って元の真偽値(boolean型)に戻します。

 

これによって、未定義の変数もif文の条件式の中でboolean型になるため、正しく判定ができます。

最後に

自分じゃ全く使わない書き方だったので、
戸惑いました(汗

他人のコードを見るときなんか、結構出てくるので、是非覚えておきましょう。

ありがとうございました。

コメント