JavaScriptでは変数を比較するときに暗黙の型変換が行われます。
まずは次の例を見てください。
//アンチパターン var zero = 0; if (zero == false) { //このブロックは実行されます。 }
上記のコードでは、変数 zero は数値の0であり、false(真偽値)ではありません。そのため、ifブロックの中身は実行されないと思われるかもしれません。
しかし数値の0は比較の際、暗黙的にfalseに変換されてしまう(0はfalseとして解釈されてしまう)ため、ifブロックの中のコードは実行されてしまいます。
これ以外にも、JavaScriptでは、変数の比較の際に下記に示すような暗黙の変換が行われます。
trueとして解釈されるもの | falseとして解釈されるもの | |
---|---|---|
数値 | 0ではない値 例) -1, 1, 10, 123 … |
0 |
文字列 | 空ではない文字列 例) “abc”, “ほげほげ” |
“” (空の文字列) |
配列 | 空ではない配列 例) [1], [5, 6, 7] |
[] (空の配列) |
例えば、
console.log(0 == false);
console.log("" == false);
console.log([1, 2, 3] == true);
といったコードではすべてtrueが出力されます。
このような暗黙の型変換による混乱を避けるためには === や !== を使うことで、比較の際に値と型の両方がチェックされるようになります。
JSLintでは「== and !=」のオプションがデフォルト(false)の場合、冒頭のコードの様に、== や != といった曖昧な比較(暗黙の型変換を許容する比較)を行うと、「Expected ‘===’ and instead saw ‘==’」という警告が出ます。ですので、このコードは下記の様に書くべきです。
var zero = 0; if (zero === false) { //数値の 0 と真偽値の false は異なるので、 //このブロックは実行されません。 }
このように、暗黙の型変換を避け、厳密な比較を行うことは、JavaScriptでは非常に重要ですので、このオプションはデフォルト(false)のままにしておいた方が良いでしょう
JSLintのオプション一覧ページへ