6

问题在标题中。我刚刚尝试在 Chrome 控制台中运行下一条语句并且得到了奇怪的(对我而言)结果:

true == 'true' // returns false
'true' == true // returns false

为什么会这样?为什么类型转换在那里不起作用,但在下一个语句中起作用?

if ('true') true // returns true
4

5 回答 5

16

因为它们不代表同样可转换的类型/值。使用的转换比 使用的简单转换==复杂得多。toBooleanif ('true')

所以给定这段代码true == 'true',它会发现:

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

因此,您会看到它从成为 开始ToNumber(true) == 'true',即1 == 'true',然后再次尝试,它现在找到了:

如果Type(x)NumberType(y)String,返回比较的结果x == ToNumber(y)

所以现在它正在做1 == ToNumber('true'),这是1 == NaN,当然是false

于 2013-10-30T18:18:25.537 回答
2

==运算符使用 ECMAScript 的抽象相等算法,该算法相当复杂。它的确切行为取决于所涉及的每个参数的类型,并且每个步骤通常涉及另一个调用另一个 ECMAScript 函数。

if(condition)语句condition使用 ECMAScript 转换为布尔值ToBoolean,这很简单,可以在单个表中表示。ToBoolean正如您在规范中看到的那样,如果任何字符串具有非零长度,则它是真实的(根据)。

于 2013-10-30T18:24:25.260 回答
0

true = 布尔类型

'true' = 字符串类型

表达式 "if ('true')" 以与 if('foo') 或任何其他字符串相同的方式将 'true'(string) 评估为 true(boolean)。

于 2013-10-30T18:21:46.343 回答
0

非空字符串将返回 true:

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

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

  • if ('') true; // not true

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

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

但是将字符串转换为布尔值时失败:

  • if(true == "true") true; // not true
于 2013-10-30T18:24:19.937 回答
-3

true 是一个布尔值 'true' 是一个字符串。

您正在比较不同的数据类型。 看这里:http://w3schools.com/js/js_datatypes.asp

于 2013-10-30T18:19:42.113 回答