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


89

MDC对==操作员的描述如下

如果两个操作数的类型不同,则JavaScript会转换操作数,然后进行严格比较。如果操作数是数字或布尔值,则在可能的情况下将操作数转换为数字;否则,操作数将转换为数字。否则,如果一个操作数是一个字符串,则另一个操作数将尽可能转换为字符串。

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

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

我最后得到的字符串"true""true"应该为true,但是JavaScript显示为false。

我错过了什么?



6
有了如此多的JavaScript,世界真是一个令人恐惧的地方:if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}--->“不,是”
user1068352 2013年

1
我得说,我很惊讶,这太愚蠢了。始终始终使用===的另一个原因
-BT

Answers:


89

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

就像您报告的那样,两者都被转换为数字,因为至少true可以被转换(请参阅Erik Reppen的评论),然后进行比较。


您能告诉我什么时候该步骤Can we convert both to a number?将是错误的吗?如果是偶数NaN,此步骤怎么会失败?
艾萨克(Isaac)

5
两者皆有。如果两者均导致NaN,则将它们转换为字符串评估。如果只可以转换一个,那么仍然有一个数字比较。
埃里克·雷彭

2
实际上,Javascript中有一些奇怪的对象,它们的行为很奇怪。例如,当您尝试将IE <9中的XML文档转换为数字时,将引发错误。
MaxArt 2012年

你可以做你自己看到的转换Number(true)Number('true')
埃里克Reppen

10

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

  1. 如果类型(x)为数字,类型(y)为字符串,则
    返回比较结果x == ToNumber(y)。
  2. 如果类型(x)为String,类型(y)为Number,则
    返回比较结果ToNumber(x)== y。
  3. 如果类型(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

===>错误


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.