为什么“true”== true在JavaScript中显示为false?

时间:2012-07-06 13:58:22

标签: javascript string equals

MDC describes the == operator as follows

  

如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。

考虑到这一点,我会按如下方式评估"true" == true

  1. 他们属于同一类型吗?
  2. 操作数是数字还是布尔值?的
  3. 我们可以将两者都转换为数字吗? isNaN(Number("true")) // true
  4. 两个操作数都是字符串吗?的
  5. 我们可以将其他操作数转换为字符串吗? String(true) === "true" // true
  6. 我最终得到的字符串"true""true"应该评估为true,但JavaScript显示为false。

    我错过了什么?

4 个答案:

答案 0 :(得分:80)

由于"true"已转换为NaN,而true转换为1。所以他们不同。

与您报告的一样,两者都转换为数字,因为至少true可以(参见Erik Reppen的评论),然后进行比较。

答案 1 :(得分:4)

== comparison operator defined in Ecma 5 as

  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)。
  5. 所以,“true”== true被js引擎解释为

    1. “true”== toNumber(true)
    2. “true”== 1
    3. toNumber(“true”)== 1
    4. NaN == 1
    5. ===>假

答案 2 :(得分:3)

根据抽象等式比较算法

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

如果其中一个oprends是布尔值而另一个不是布尔值,则布尔值转换为数字0或1.因此true == "true"为假。

答案 3 :(得分:0)

考虑场景true == "true"进行解释。
直接,上面返回false,然而,我们的期望是true
JavaScript 使用抽象相等比较算法,所以根据算法

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