JSLintオプション考察「== and !=」

2013年06月28日

カテゴリー:

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のオプション一覧ページへ