Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@norami_dream

Javascriptの等価演算子, 厳密等価演算子, Object.is

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は等しくない

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?