長らくjavascriptに触れてきたものの、**等価演算子(==)と厳密等価演算子(===)**の違いをなんとなくほわんとしたイメージで捉えてしまっていたので、今更ながら再確認。
##空文字('') == 0 の結果は?
再確認のきっかけとなったのが上記の式の結果。
var kara = '';
kara == 0; // true
上記の結果にfalseを期待していたので**「あれ?」となった。
結論からいくと、falseを期待する場合は演算子を等価演算子ではなく厳密等価演算子**を使えばよい。
kara === 0; // false
これは、厳密等価演算子が型と内容を厳密に判定するため。
等価演算子は両辺の型を解釈し、異なる型の場合に同じ型に変換をしてくれるため、前者の判定はtrueとなる。
つまり、等価演算子はいい感じに型を一方に寄せて判定をしてくれる気の利いたヤツなのだ。
一方厳密等価演算子は、余計な配慮はせずにバッサリと判定する白黒ハッキリしたヤツである。
判定を行う際はこの性格の違いをよく考えて適当な方を選択する必要がある、と改めて認識した次第。
以下、間違えやすそうな判定を思いつく限り列挙。
'1' == 1; // true(文字列を数値に変換後に比較される)
'1' === 1; // false
true == 1; // true(真偽値を数値に変換後に比較される)
true === 1; // false
false == 0; // true
false === 0; // false
null == 0; // false(型を寄せることができないのでfalse null === 0も同様)
undefined == 0; // false(型を寄せることができないのでfalse undefined === 0も同様)
null == undefined; // true
null === undefined; // false
'1' == new String('1'); // true(右辺はオブジェクトなので、プリミティブな文字列に変換後に比較される)
'1' === new String('1'); // false
NaN == NaN; // false
NaN === NaN; // false(NaNの比較はいずれの場合もfalseとなるので注意)
Object.is(NaN, NaN); // true(NaNを正確に比較したい場合、Object.is()で判定可能。IEは未対応とあるがWindows10・IE11で動作した)
Object.is(-0, +0); // false(余談だがObject.is()は0の記号違いも異なると解釈する)
両演算子の判定について詳細な説明は以下を参照。
等価演算子の判定アルゴリズム
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
厳密等価演算子の判定アルゴリズム
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6