为什么('0'?'a':'b')的行为与('0'== true?'a':'b')不同?
为什么以下两个陈述的结果不同?
('0' ? 'a' : 'b') /* -> 'a' */ ('0' == true ? 'a' : 'b') /* -> 'b' */
jsFiddletesting用例
编辑:
我应该补充一点,我怀疑'0'第一个语句被转换为布尔型进行比较 – 应该是完全一样的''0'== true“显然这是不正确的。
首先,为了完整性:
('0' ? 'a' : 'b')
是'a'
,因为'0'
是一个非空string,总是计算结果为true
:
string:如果参数是空string(长度为零),则结果为false ; 否则结果是真的 。
现在为'0' == true
。
两种types转换将在这里发生。 我们可以在规范的第11.9.3节“抽象平等比较algorithm”中看到这一点。
操作数表示为x
和y
( x == y
)。
在我们的例子中, x
是一个string( '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。
如何将string转换为数字更复杂,但当然也可以在规范中find。
所以最后的比较是
0 == 1
这是false
(步骤1. a。vi。)
('0' ? 'a' : 'b'); /* -> 'a' */
0是一个string值 ,每个非空string被评估为true ,而不是testing为布尔值。 如果引号被删除:
(0 ? 'a' : 'b'); /* -> 'b' */
你会收到b – 现在0不是一个string,并评估为假!
('0' == true ? 'a' : 'b'); /* -> 'b' */
0被评估为bool两者都被评估为数字,这是假的。 第11.9.3节 规范中 的抽象等式比较algorithm表明可以执行一些转换来比较相同types的variables。
因为'0'不等于1,所以它不等于真,尽pipe它不是假的。 在第一种情况下,当'0'被转换为bool时,铸造操作符对于不是0的所有东西都返回true。
主要是因为在真实性方面JavaScript相当不协调。 但答案是:
- 在这种情况下,“0”直接转换为布尔值,而“0”(非空string)为true。
- 在这种情况下,不会发生转换。 一个string不等于一个布尔值。
这是因为'0'
是真实的(在if语句中),但不被认为等于true
。 就像3和17都是真实的,但不是平等的。
('0'?'a':'b') – > 0是错误的,'0'是一些string,因此NOT FALSE 0,null或''(空string)在这种情况下被视为FALSE
('0'== true?'a':'b') – >正如其他人所说的那样some_string与布尔值相比TRUE不是TRUE