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

Isa*_*aac 84 javascript string equals

MDC描述了==运营商如下:

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

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

  1. 它们属于同一类型吗?没有
  2. 操作数是数字还是布尔值?
  3. 我们可以将两者都转换为数字吗?没有(isNaN(Number("true")) // true)
  4. 两个操作数都是字符串吗?
  5. 我们可以将其他操作数转换为字符串吗?是的(String(true) === "true" // true)

我已经结束了与弦"true""true",这应该求true,但JavaScript的显示错误.

我错过了什么?

Max*_*Art 83

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

就像你报道的那样,两者都被转换为数字,因为至少true可以(参见Erik Reppen的评论),然后进行比较.

  • 这就是为什么你永远不会在我的JS中看到我写'== true`的原因 - 如果值是真的,那么它将通过测试而不告诉它它必须是真的. (7认同)
  • 要么两者都没有.如果两者都会导致NaN,他们将切换到字符串评估.如果只能转换一个,那么仍然有一个数字比较. (5认同)
  • 实际上Javascript中有一些奇怪的对象表现得非常奇怪.例如,当您尝试将它们转换为数字时,IE <9中的XML文档会引发错误. (2认同)
  • @Kolink所以,等等 - 你在Javascript中告诉我`if(x)`可以评估为true,而`if(x == true)`可以评估为false?O_O (2认同)

nob*_*n94 5

==比较运算符在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)为Boolean,则返回比较结果x == ToNumber(y)。

因此,js引擎将“ true” == true解释为

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

===>错误