为什么在JS中true == 'true'语句返回false?

5
题目已经在标题中了。我刚刚尝试在Chrome控制台中运行下面的语句,结果很奇怪(至少对我来说是奇怪的):
true == 'true' // returns false
'true' == true // returns false

为什么会这样?为什么类型转换在这里不起作用,但在下一条语句中起作用呢?
if ('true') true // returns true

2
@Hogan:它仍将是“false”。 - Blue Skies
http://docs.nodejitsu.com/articles/javascript-conventions/what-are-truthy-and-falsy-values - Hogan
1
类型转换对前两个代码片段也有效,尽管 true 被转换为 1,但它与 'true' 不相等。 - Teemu
5个回答

16
因为它们不代表等同的可转换类型/值。 == 使用的转换比 if('true') 中使用的简单的 toBoolean 转换复杂得多。
所以,对于这段代码 true == 'true',它找到了这个:

"如果 Type(x)Boolean,返回比较结果 ToNumber(x) == y。"

你会发现它开始变成了 ToNumber(true) == 'true',即 1 == 'true',然后再尝试一次,在这里找到了:

如果 Type(x)Number 并且 Type(y)String,则返回比较结果 x == ToNumber(y)

所以现在它正在执行 1 == ToNumber('true'),即 1 == NaN,当然是 false

+1 解释得非常清楚!你能提供这些信息的来源链接吗? - Philipp Sander
@PhilippSander:使用 Rocket 的链接。它是一个非官方的副本,但具有良好的交叉链接和注释。这是抽象相等比较算法 - Blue Skies

2
== 运算符使用 ECMAScript 的 抽象相等算法,该算法非常复杂。其确切行为取决于涉及每个参数的类型,并且每个步骤通常涉及调用另一个 ECMAScript 函数。 if(condition) 语句使用 ECMAScript 的 ToBooleancondition 转换为布尔值,这足够简单,可以用一个表达式来表示。如你在规范中看到的,如果字符串长度不为零,则任何字符串都为真(根据 ToBoolean)。

0

true = 布尔类型

'true' = 字符串类型

表达式 "if ('true')" 将 'true'(字符串) 与 if('foo') 或任何其他字符串一样,将其评估为 true(布尔值)。


0

非空字符串将返回true:

  • if ('0') true; // true
  • if ('false') true; // true
  • if ('anything') true; // true

空字符串将返回undefined,因此为falsy

  • if ('') true; // 不是true

在比较类型时,JavaScript会尝试为您做一些魔术:

  • if (1 == "1") true; // true

但当将字符串转换为布尔值时,它会失败:

  • if(true == "true") true; // 不是true

-3

JavaScript在使用==时会转换类型,但在使用===时不会。 - Philipp Sander
哦请。充满仇恨。 但是当时w3确实帮助过我开始学习JavaScript。他们从未试图成为“规范”。只是提供了一个简单的方式来启动人们。在任何学校中,你总是为了理解而过度简化事物,然后稍后呈现“真相”。 - AwokeKnowing
@AwokeKnowing 也许吧,但你认为SO用户期望什么?我敢打赌不是你所说的“真相”。MDN在参考方面比SO好100500倍。最后,他们有自己的浏览器和JS引擎,而w3fools没有。 - antyrat
1
@antyrat:曾经w3fools有一定道理,但现在他们最大的争议是w3schools没有维基化,所以更新速度不是超音速 :) 他们现在有了论坛和建议方法,以前没有。与其要求他们进行维基化,不如让其他网站提供这个选项...哦等等,其他人已经试过了,却被w3schools遮盖了,它通常是95%准确的,你可以谷歌剩下的5%或者来SO寻求帮助。 - vol7ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接