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

MDC描述==运算符如下 :

如果两个操作数的types不同,JavaScript会转换操作数,然后进行严格的比较。 如果任一操作数是一个数字或一个布尔值,操作数将尽可能转换为数字。 否则,如果任一操作数是一个string,则另一个操作数将被转换为一个string(如果可能)。

考虑到这一点,我会评估"true" == true ,如下所示:

  1. 他们是同一types吗? 没有
  2. 操作数是数字还是布尔值?
  3. 我们可以转换成一个数字吗? isNaN(Number("true")) // true
  4. 操作数是string吗?
  5. 我们可以将另一个操作数转换为string吗? String(true) === "true" // true

我已经结束了string"true""true" ,这应该评估为true ,但JavaScript显示错误。

我错过了什么?

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

就像你所报道的,两者都被转换成数字,因为至less可以是true (见Erik Reppen的评论),然后进行比较。

==比较运算符在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

根据抽象平等比较algorithm

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

如果其中一个是一个布尔值,另一个不是,则布尔型转换为数字0或1.所以true == "true"为false。