javascriptの等価演算子の動作が複雑なことが良く知られていますが、どこがどう複雑なのか、まとめてみました。
等価演算子(==)
数値変換
String、Boolean、Numberのうち異なるものを比較するときは、すべてNumberに変換される。String->Numberの変換はparseIntの動作に準じ、Boolean->Numberは、trueが1、falseが0とみなされる。特に、StringとBooleanの比較は、以下のようにかなり直感に反した結果になるので注意。
// 例
"123" == 123
"1" == true
"0" == false
"2" != true
"true" != true
文字列変換
オブジェクトをString, Number, Booleanと比較するときは、オブジェクトのtoString()またはvalueOf()の結果に基いて文字列に変換される。Number, Booleanと比較するときは、さらに上述の数値変換が適用される。特に配列が絡むと以下の例のようにトリッキーな比較になるので注意。
// 例:
[1,2,3] == "1,2,3"
[1] == true
[0] == false
[123] == 123
[null] == ''
[] == ''
String | Boolean | Number | null | undefined | Object | NaN | |
---|---|---|---|---|---|---|---|
String | 値 | 数値変換 | 数値変換 | FALSE | FALSE | 文字列変換 | FALSE |
Boolean | 数値変換 | 値 | 数値変換 | FALSE | FALSE | 文字列変換+数値変換 | FALSE |
Number | 数値変換 | 数値変換 | 値*1 | FALSE | FALSE | 文字列変換+数値変換 | FALSE |
null | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
undefined | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
Object | 文字列変換 | 文字列変換+数値変換 | 文字列変換+数値変換 | FALSE | FALSE | 参照 | FALSE |
NaN | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
*1 +0と-0は等しい
厳密等価演算子(===)
等価演算子との違いは、異なる種類の比較はすべてFALSEとなること。このため、上述のような暗黙の変換は行われない。
String | Boolean | Number | null | undefined | Object | NaN | |
---|---|---|---|---|---|---|---|
String | 値 | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
Boolean | FALSE | 値 | FALSE | FALSE | FALSE | FALSE | FALSE |
Number | FALSE | FALSE | 値*1 | FALSE | FALSE | FALSE | FALSE |
null | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
undefined | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE |
Object | FALSE | FALSE | FALSE | FALSE | FALSE | 参照 | FALSE |
NaN | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
*1 +0と-0は等しい
Object.is
厳密等価演算子との違いは、NaN !== NaNだが、Object.is(Nan, NaN) == trueとなることと、Object.is(+0, -0) == falseとなること
String | Boolean | Number | null | undefined | Object | NaN | |
---|---|---|---|---|---|---|---|
String | 値 | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
Boolean | FALSE | 値 | FALSE | FALSE | FALSE | FALSE | FALSE |
Number | FALSE | FALSE | 値*2 | FALSE | FALSE | FALSE | FALSE |
null | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
undefined | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE |
Object | FALSE | FALSE | FALSE | FALSE | FALSE | 参照 | FALSE |
NaN | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE |
*2 +0と-0は等しくない