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


89

MDCは、==オペレーターを次のように説明しています

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

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

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

文字列"true""true"、に評価されるはずですtrueが、JavaScriptはfalseを示しています。

私は何を逃しましたか?



6
JavaScriptがたくさんあるので、世界は恐ろしい場所です:if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "no yes"
user1068352 2013

1
私は驚いたと言わざるを得ません、そしてそれはこれが起こるのはとても愚かです。常に常に使用するさらに別の理由===
BT

回答:


89

"true"変換されるためNaN、にtrue変換されます1ます。だから彼らは違う。

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


そのとき、そのステップCan we convert both to a number?がいつ間違っているか教えていただけますか?NaN数字でさえあるとしても、このステップはどうして失敗するのでしょうか?
アイザック

5
どちらか対どちらでもない。両方がNaNになる場合は、文字列評価に切り替えます。変換できるのが1つだけの場合でも、数値の比較があります。
Erik Reppen 2012

2
実際、Javascriptには、非常に奇妙な動作をする奇妙なオブジェクトがいくつかあります。たとえば、IE <9のXMLドキュメントを数値に変換しようとすると、エラーが発生します。
MaxArt 2012

次のNumber(true)Number('true')
手順を

10

==比較演算子はれるECMA 5で定義されたとおり

  1. 場合タイプ(x)は数値とあるタイプ(y)は文字列であり、
    比較のx ==の結果を返すはToNumberを(y)を。
  2. 場合タイプ(X)文字列とであるタイプ(Y)の数であり、
    比較の結果を返すはToNumber(x)== yと。
  3. タイプの場合(x)がブール値の、比較ToNumberの結果を返します(x)== yます。
  4. タイプ(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。

したがって、 "true" == trueは次のように評価されます。

  1. "true" == ToNumber(true)   (ルール7経由)
  2. "true" == 1
  3. ToNumber( "true")== 1   (ルール5経由)
  4. NaN == 1

===> false


3

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

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

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


私は次のように正しく推測しましたか?"true" == trueは "true" == 1になり、次に "true" == "1"になります。そのため、falseが返されますか?
vuquanghoang 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.