Str*_*yer 111 javascript
为什么以下两个语句的结果不同?
('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */
Run Code Online (Sandbox Code Playgroud)
编辑:
我应该补充一点,我怀疑'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节"抽象等式比较算法"中遵循这一点.
操作数表示为x和y(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.)
('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抽象平等比较算法从规格显示,可以被执行多次转换的比较同类型的变量.
| 归档时间: |
|
| 查看次数: |
6936 次 |
| 最近记录: |