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

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

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

jsFiddletesting用例

编辑:

我应该补充一点,我怀疑'0'第一个语句被转换为布尔型进行比较 – 应该是完全一样的''0'== true“显然这是不正确的。

首先,为了完整性:

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

'a' ,因为'0'是一个非空string,总是计算结果为true

string:如果参数是空string(长度为零),则结果为false ; 否则结果是真的


现在为'0' == true

两种types转换将在这里发生。 我们可以在规范的第11.9.3节“抽象平等比较algorithm”中看到这一点。

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

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

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

当布尔变换为数字时, 发生以下转换 :

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

现在我们有了

 '0' == 1 

与步骤5中的条件相匹配:

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

如何将string转换为数字更复杂,但当然也可以在规范中find。

所以最后的比较是

 0 == 1 

这是false (步骤1. a。vi。)

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

0是一个string值 ,每个非空string被评估为true ,而不是testing为布尔值。 如果引号被删除:

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

你会收到b – 现在0不是一个string,并评估为假!

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

0被评估为bool两者都被评估为数字,这是假的。 第11.9.3节 规范中 的抽象等式比较algorithm表明可以执行一些转换来比较相同types的variables。

因为'0'不等于1,所以它不等于真,尽pipe它不是假的。 在第一种情况下,当'0'被转换为bool时,铸造操作符对于不是0的所有东西都返回true。

主要是因为在真实性方面JavaScript相当不协调。 但答案是:

  1. 在这种情况下,“0”直接转换为布尔值,而“0”(非空string)为true。
  2. 在这种情况下,不会发生转换。 一个string不等于一个布尔值。

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

('0'?'a':'b') – > 0是错误的,'0'是一些string,因此NOT FALSE 0,null或''(空string)在这种情况下被视为FALSE

('0'== true?'a':'b') – >正如其他人所说的那样some_string与布尔值相比TRUE不是TRUE