('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')
因为'0'
是非空字符串,总是评估为true
,所以'a'
是true
:
字符串:如果参数是空字符串(长度为零),则结果为false;否则结果为true。
现在看'0' == true
。
这里会进行两次类型转换。我们可以在规范的第11.9.3节“抽象相等比较算法”中了解这一点。
操作数表示为x
和y
(x == y
)。
在我们的情况下,x
是一个字符串('0'
),而y
是一个布尔值(true
)。因此执行步骤7:
如果Type(y)是Boolean,则返回比较x == ToNumber(y)的结果。
当布尔值转换为数字时,会进行以下转换:
布尔值:如果参数是true,则结果为1。如果参数是false,则结果为+0。
现在我们有:
'0' == 1
符合第5步条件的内容为:
如果x的类型是字符串,且y的类型是数字,则返回比较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类型 两者被视为数字,即false。从specs中可以看到,11.9.3抽象相等比较算法指出可能需要执行多个转换才能比较同一类型的变量。
'0'
在if语句中被视为真,但不被认为等于true
。就像3和17都是真的,但不相等。('0' ? 'a' : 'b') --> 0代表假,而'0'是一个字符串,因此不是假 在这种情况下,0、null或''(空字符串)被视为假
('0' == true ? 'a' : 'b') --> 如其他人所述,将某个字符串与布尔值TRUE进行比较并不等于TRUE