96

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

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

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

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

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

私は何を逃しましたか?

4

5 に答える 5

95

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

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

于 2012-07-06T14:01:08.220 に答える
18

==比較演算子は、ECMA5で次のように定義されています。

  1. タイプ(x)が数値で、タイプ(y)が文字列の場合
    、比較の結果x == ToNumber(y)を返します。
  2. タイプ(x)が文字列でタイプ(y)が数値の場合
    、比較ToNumber(x)==yの結果を返します。
  3. Type(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

于 2015-05-22T09:58:14.593 に答える
4

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

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

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

于 2016-10-22T19:54:06.080 に答える
1

等式演算子(==および!=)は、抽象等式比較アルゴリズムを使用して2つのオペランドを比較します。

"true" == true

"true"isStringtrueisなので、(アルゴリズムのステップ)Booleanの結果を返す必要があります。これはです。"true" == Number(true)7"true" == 1

"true" == 1

"true"isString1isなので、(アルゴリズムのステップ)Numberの結果を返す必要があります。を返します。今、私たちは持っています。Number("true") == 15Number("true")NaNNaN == 1

NaN == 1

これで、両方のオペランドは同じタイプ(Number)になります。アルゴリズムによれば、両方のオペランドがNumberであり、一方がである場合NaNfalseが返されます(1.c.iアルゴリズムのステップ)。

于 2021-09-15T20:35:25.843 に答える
0

シナリオtrue=="true"を考慮して説明します。率直に言って、上記はfalse
を 返しますが、 JavaScriptはAbstract Equality Comparison Algorithmを使用しているため、アルゴリズムによると、私たちの期待はtrueでした。

true == "true"

// If one of the operands is Boolean, convert the Boolean operand to 1 if it is true and +0 if it is false
ConvertToNumber(true) == "true"

1 == "true"

// When the algorithm finds the above statements, it thinks that it needs to do one more conversion - 
// "When comparing a number to a string, try to convert the string to a numeric value"
1 == ConvertToNumber("true)
1 == NaN

// Which returns false
于 2021-06-10T12:52:59.320 に答える