Javascript 为什么(';0';?';a';';b';)的行为与(';0';==真?';a';b';)
为什么以下两种说法的结果不同Javascript 为什么(';0';?';a';';b';)的行为与(';0';==真?';a';b';),javascript,Javascript,为什么以下两种说法的结果不同 ('0'?'a':'b')/*->'a'*/ ('0'==true?'a':'b')/*->'b'*/ 编辑: 我应该补充一点,我怀疑将“0”转换为要比较的布尔值的第一个语句-它应该与“'0'==true”完全相同 显然这不是真的。因为“0”不等于1,所以它不等于真,尽管它不是假。 在第一种情况下,当“0”被强制转换为bool时,强制转换运算符对所有非0的内容返回true。这是因为'0'是true(在if语句中),但不被视为等于true。就像3和17都是真实的,
('0'?'a':'b')/*->'a'*/
('0'==true?'a':'b')/*->'b'*/
编辑:
我应该补充一点,我怀疑将“0”转换为要比较的布尔值的第一个语句-它应该与“'0'==true”完全相同
显然这不是真的。因为“0”不等于1,所以它不等于真,尽管它不是假。
在第一种情况下,当“0”被强制转换为bool时,强制转换运算符对所有非0的内容返回true。这是因为
'0'
是true(在if语句中),但不被视为等于true
。就像3和17都是真实的,但并不相等。主要是因为JavaScript在真实性方面非常不一致。但答案是:
('0' ? 'a' : 'b'); /* -> 'a' */
0是一个字符串值,每个非空字符串都被评估为真,而不是作为布尔值进行测试。如果删除了引号:
(0 ? 'a' : 'b'); /* -> 'b' */
您将收到b-现在0不是字符串,并且评估为false
('0' == true ? 'a' : 'b'); /* -> 'b' */
0计算为bool,两者都计算为数字,这是false。中的点表明可以执行大量转换来比较相同类型的变量。首先,为了完整性:
('0' ? 'a' : 'b')
是'a'
,因为'0'
是:
字符串:如果参数为空字符串(长度为零),则结果为false;
否则结果为真
现在转到
'0'==true
这里将进行两次类型转换。我们可以在规范中遵循这一点
操作数表示为x
和y
(x==y
)
在我们的例子中,x
是一个字符串('0'
),而y
是一个布尔值(true
)。因此,执行步骤7:
如果类型(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'==false)也是false。第二条语句中的字符串似乎已转换为布尔值。('1'==true)->true,('0'==false)->trueWell,('1'==true)为true;)在第二条语句中没有===这个词。我认为它是相当一致的,问题是我们如何使用它。有些东西并不像我们想的那样被使用。但所有这些都是解释的问题,导致不同的解决方案等等,而不是像数学中那样的普遍真理你的第二点错了。确实发生了转换。实际上,您将“0”计算为布尔值的说法是不正确的,实际发生的情况是将“true”计算为数字,然后强制将“0”计算为数字。这是您指向的规范的直接结果。另见费利克斯·金的回答。