为什么('0'?'a':'b')的行为不同于('0'== true?'a':'b')

时间:2011-09-21 08:27:19

标签: javascript

为什么以下两个陈述的结果不同?

('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */

jsFiddle testcase

编辑:

我应该补充一点,我怀疑'0'第一个语句要转换为boolean来进行比较 - 这应该与“'0'== true”完全相同 显然这不是真的。

6 个答案:

答案 0 :(得分:207)

首先,为了完整性:

('0' ? 'a' : 'b') 

'a',因为'0'a non-empty string, which always evaluates to true

  

String:如果参数为空String(其长度为零),则结果为 false ;   否则结果是 true


现在到'0' == true

这里将进行两种类型的转换。我们可以在规范section 11.9.3, The Abstract Equality Comparison Algorithm中遵循这一点。

操作数表示为xyx == y)。

在我们的例子中,x是一个字符串('0'),y是一个布尔值(true)。因此执行步骤7:

  

如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。

当布尔值转换为数字时,the following conversion takes place

  

布尔值:如果参数为 true ,则结果为 1 。如果参数为 false ,则结果为 +0

现在我们有了

'0' == 1

匹配第5步中的条件:

  

如果Type(x)是String而Type(y)是Number,则返回比较结果ToNumber(x)== y。

如何将字符串转换为数字更复杂,但当然也可以在specification中找到。

所以最后的比较是

0 == 1

false(步骤1. a.vi。)

答案 1 :(得分:8)

('0' ? 'a' : 'b'); /* -> 'a' */

0是字符串值,每个非空字符串评估为 true ,并且未测试为boolean。如果删除了引号:

(0 ? 'a' : 'b'); /* -> 'b' */

您将收到b - 现在 0 不是字符串并且评估为false!

('0' == true ? 'a' : 'b'); /* -> 'b' */

0被评估为bool 两者都被评估为数字,这是假的。来自 11.9.3 The Abstract Equality Comparison Algorithm 的点 specs 表明可能会执行多次转化比较相同类型的变量。

答案 2 :(得分:3)

因为'0'不等于1,所以它不等于true,尽管它不是假的。 在第一种情况下,当'0'被转换为bool时,对于非0的所有内容,转换运算符返回true。

答案 3 :(得分:1)

主要是因为JavaScript在真实性方面非常不一致。但答案是:

  1. 在这种情况下,“0”直接转换为布尔值,“0”(非空字符串)为真。
  2. 在这种情况下,不会发生转换;字符串不等于布尔值。

答案 4 :(得分:-3)

那是因为'0'是真实的(在if语句中),但不被认为等于true。就像3和17都是真实的,但不相等。

答案 5 :(得分:-4)

('0'?'a':'b') - > 0为假,'0'为某个字符串因此不为假 0,null或''(空字符串)在这种情况下被视为FALSE

('0'== true?'a':'b') - >正如其他人所提到的,some_string与布尔值TRUE相比是不正确的