关于字符串:为什么“true”== true在JavaScript中显示为false?

Why does “true” == true show false in JavaScript?

MDC对==运算符的描述如下:

If the two operands are not of the same type, JavaScript converts the operands then applies strict comparison. If either operand is a number or a boolean, the operands are converted to numbers if possible; else if either operand is a string, the other operand is converted to a string if possible.

考虑到这一点,我将对"true" == true进行如下评估:

  • 它们是同一类型的吗?不
  • 操作数是数字还是布尔值?是的
  • 我们能把两者都转换成数字吗?否(isNaN(Number("true")) // true)
  • 操作数是否为字符串?是的
  • 我们能把另一个操作数转换成字符串吗?是(String(true) ==="true" // true)
  • 我最后得到的字符串是"true""true",应该对true进行评估,但javascript显示为假。

    我错过了什么?


    因为"true"转换成NaN,而true转换成1。所以他们不同。

    正如您所报告的,这两个都被转换为数字,因为至少可以是true(参见erik reppen的评论),然后进行比较。


    =ECMA 5中定义的比较运算符为

  • 如果type(x)是数字,type(y)是字符串,返回比较结果x==t编号(y)。
  • 如果类型(x)是字符串,类型(y)是数字,
  • 如果类型(x)是布尔值,则返回比较结果tonumber(x)==y。
  • 如果类型(y)是布尔值,则返回比较结果x==tonumber(y)。
  • 因此,"true"==true由JS引擎解释为

  • "真"=t编号(真)
  • "真"=1
  • t编号("真")==1
  • Na=1
  • ==>假


    根据抽象的等式比较算法

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

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