web-dev-qa-db-ja.com

JavaScriptで「true」== trueがfalseと表示されるのはなぜですか?

MDCは_==_演算子を次のように記述します

2つのオペランドが同じタイプではない場合、JavaScriptはオペランドを変換してから厳密な比較を適用します。いずれかのオペランドが数値またはブール値の場合、オペランドは可能であれば数値に変換されます。それ以外の場合、どちらかのオペランドが文字列である場合、他のオペランドは可能であれば文字列に変換されます。

これを念頭に置いて、次のように_"true" == true_を評価します。

  1. それらは同じタイプですか? いいえ
  2. オペランドは数値またはブール値のどちらですか? はい
  3. 両方を数値に変換できますか? いいえisNaN(Number("true")) // true
  4. どちらかのオペランドは文字列ですか? はい
  5. もう一方のオペランドを文字列に変換できますか? はいString(true) === "true" // true

文字列_"true"_および_"true"_になりました。これらはtrueに評価されるはずですが、JavaScriptはfalseを示します。

私は何を見逃しましたか?

81
Isaac

なぜなら"true"NaNに変換され、true1。だから彼らは異なります。

あなたが報告したように、両方とも少なくともtrueになる可能性があるため(Erik Reppenのコメントを参照)、数値に変換されてから比較されます。

81
MaxArt

== Ecma 5で定義されている比較演算子

  1. Type(x)がNumberでType(y)がStringの場合、比較x == ToNumber(y)の結果を返します。
  2. Type(x)がStringでType(y)がNumberの場合、
  3. Type(x)がブール値の場合、比較ToNumber(x)== yの結果を返します。
  4. Type(y)がブールの場合、比較x == ToNumber(y)の結果を返します。

したがって、「true」== trueは、jsエンジンによって次のように解釈されます。

  1. 「true」== toNumber(true)
  2. 「true」== 1
  3. toNumber( "true")== 1
  4. NaN == 1

===> false

5
nobitavn94

抽象的平等比較アルゴリズムによる

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.

oprendsの1つがブール値で、もう1つがブール値でない場合、ブール値は0または1の数値に変換されます。したがってtrue == "true"はfalseです。

3
Zohaib Ijaz