2014年6月7日土曜日

JavaScriptで比較演算子を用いた場合の真偽値判定について

株式会社Pro-SPIREソリューション事業部の横田です。

今回のテーマは、JavaScriptで比較演算子を用いた場合の真偽値判定についてです。

とあるコードを読んでいたところ、下記のような条件分岐に出会いました。

var temp = '0';
if (temp == false)
{
  alert('error');
}

結果から申し上げますと、このコードが実行された場合、アラートが表示されます。
しかし私はこの結果に納得がいきませんでした。

まず前提として、JavaScriptでは、if文の分岐条件にboolean型以外の値が入った場合、
下記のような判定になります。

  • 'abc' true // 文字列
  • '0' true // 文字列0
  • 'false' true // 文字列のfalse
  • '' false // 空文字列
  • 0 false // 数字の0
  • -1 true // 数字の負の値
  • 1 true // 数字の正の値
  • undefined false // undefined
  • null false // null

上記を踏まえて再びコードに戻ります。

var temp = '0';
if (temp == false)
{
  alert('error');
}

'0' は false, false はもちろん false ですので、
'0' == falsetrue == false となり、不一致。
つまり、アラートは表示されないはずです。

ですが、比較演算子になると少々訳が違うようです。

● 文字列'0' (=true) と bool値true (=true) の比較
'0' == true → false

● 数字の0 (=false) と bool値false (=false) の比較
0 == false → true

● 数字の負の値 (=true) と bool値true (=true) の比較
-1 == true → false

● 文字列'false' (=true) と bool値false (=false) の比較
'false' == false → false

非常に奥が深い世界です。
比較に関して正確に理解していない場合、
誤った挙動を起こさないためにも、できるだけ厳密演算子を用いたほうが良さそうです。

0 件のコメント:

コメントを投稿