为什么下面两个语句的结果不同?
('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */
编辑:
我应该补充一点,我怀疑将 '0' 第一个语句转换为要比较的布尔值 - 这应该与“ '0' == true ”完全相同,显然这不是真的。
为什么下面两个语句的结果不同?
('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */
编辑:
我应该补充一点,我怀疑将 '0' 第一个语句转换为要比较的布尔值 - 这应该与“ '0' == true ”完全相同,显然这不是真的。
首先,为了完整性:
('0' ? 'a' : 'b')
is 'a',因为'0'是一个非空字符串,它的计算结果总是true:
字符串:如果参数为空字符串(其长度为零),则结果为假;否则结果为真。
现在到'0' == true.
这里将进行两种类型转换。我们可以在规范的第 11.9.3 节“抽象平等比较算法”中遵循这一点。
操作数表示为x和y( x == y)。
在我们的例子中,x是一个字符串 ( '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 的比较结果。
如何将字符串转换为数字更为复杂,但当然也可以在规范中找到。
所以最后的比较是
0 == 1
即false(步骤 1.a.vi.)
('0' ? 'a' : 'b'); /* -> 'a' */
0 是一个字符串值,每个非空字符串都被评估为true,而不是作为布尔值进行测试。如果引号被删除:
(0 ? 'a' : 'b'); /* -> 'b' */
您将收到 b - 现在0不是字符串并被评估为 false!
('0' == true ? 'a' : 'b'); /* -> 'b' */
0 被评估为 bool两者都被评估为数字,这是错误的。点11.9.3抽象平等比较算法从规格显示,可以被执行多次转换的比较同类型的变量。
因为'0'不等于1,所以它不等于真,虽然它不是假的。在第一种情况下,当将 '0' 强制转换为 bool 时,强制转换运算符对所有不为 0 的内容返回 true。
主要是因为 JavaScript 在真实性方面非常不一致。但答案是:
那是因为'0'是真的(在 if 语句中),但不被视为等于true. 就像 3 和 17 都是真实的,但不相等。