Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

norami_dream
javascript, node.js, AngularJS, mongoDB。たまに、MySQL, python
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした