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

Str*_*yer 111 javascript

为什么以下两个语句的结果不同?

('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */
Run Code Online (Sandbox Code Playgroud)

jsFiddle测试用例

编辑:

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

Fel*_*ing 207

首先,为了完整性:

('0' ? 'a' : 'b') 
Run Code Online (Sandbox Code Playgroud)

'a',因为'0'一个非空字符串,它始终计算为true:

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


现在来'0' == true.

这里将进行两种类型的转换.我们可以在规范第11.9.3节"抽象等式比较算法"中遵循这一点.

操作数表示为xy(x == y).

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

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

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

Boolean:如果参数为true,则结果为1.如果参数为false,则结果为+0.

现在我们有

'0' == 1
Run Code Online (Sandbox Code Playgroud)

符合步骤5中的条件:

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

字符串如何转换为数字更复杂,但当然也可以在规范中找到.

所以最后的比较是

0 == 1
Run Code Online (Sandbox Code Playgroud)

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

  • 非常好的答案,有足够的细节供其他人遵循.我刚刚学到了一些关于JavaScript转换规则的内容,它将答案的好处加倍;-) (17认同)
  • 实际上(是的,我会烦恼,对不起),('0'?'a':'b')不是真的.这是'a':-D (3认同)
  • 好的,这似乎是最详细的答案,所以我现在接受这个.谢谢所有其他人:) (2认同)
  • @boycy :: D你是对的;)....固定(为了清楚起见). (2认同)

Bak*_*dan 8

('0' ? 'a' : 'b'); /* -> 'a' */
Run Code Online (Sandbox Code Playgroud)

0是一个字符串值,每个非空字符串被评估为true,而不是作为boolean测试.如果删除了引号:

(0 ? 'a' : 'b'); /* -> 'b' */
Run Code Online (Sandbox Code Playgroud)

你将收到b - 现在0不是一个字符串并被评估为false!

('0' == true ? 'a' : 'b'); /* -> 'b' */
Run Code Online (Sandbox Code Playgroud)

0被评估为bool两者都被评估为数字,这是错误的.点11.9.3抽象平等比较算法规格显示,可以被执行多次转换的比较同类型的变量.