为什么以下两个陈述的结果不同?
('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */
编辑:
我应该补充一点,我怀疑'0'第一个语句要转换为boolean来进行比较 - 这应该与“'0'== true”完全相同 显然这不是真的。
答案 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中遵循这一点。
操作数表示为x
和y
(x == 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在真实性方面非常不一致。但答案是:
答案 4 :(得分:-3)
那是因为'0'
是真实的(在if语句中),但不被认为等于true
。就像3和17都是真实的,但不相等。
答案 5 :(得分:-4)
('0'?'a':'b') - > 0为假,'0'为某个字符串因此不为假 0,null或''(空字符串)在这种情况下被视为FALSE
('0'== true?'a':'b') - >正如其他人所提到的,some_string与布尔值TRUE相比是不正确的