据我所知,在JavaScript!应该规范化一个布尔值,将其从某个其他类型转换为true或false。这意味着“0”转换为布尔值true。另一方面,如果我将它与false进行比较,事实证明它实际上是假的(因为比较的结果是真的)。我在这里错过了什么规则。我已经在IE和Opera中测试了它。
答案 0 :(得分:10)
==
运算符检查松散的平等,这与真实性无关。
具体来说,它会将操作数转换为数字,然后比较数字
包含数字的字符串会转换为它们包含的数字;布尔值转换为0
和1
如果已定义,则通过调用valueOf
来转换对象。
因此,以下所有情况均属实:
"1" == 1
"0" == false
"1" == true
"2" != true
"2" != false
({ valueOf:function() { return 2; } }) == 2
({ valueOf:function() { return 1; } }) == true
答案 1 :(得分:9)
在第一种情况下,非空字符串等同于true。
在第二种情况下,因为一个操作数是布尔值,所以两个操作数都转换为数值。我相信false
会转换为数字0
而字符串"0"
也会转换为数字0
,从而导致0 == 0
为真。
查看Mozilla reference操作员行为。
答案 2 :(得分:2)
对于第一个表达式,ECMA-262的9.2节定义了逻辑NOT运算符内部使用的抽象操作ToBoolean。它说:
字符串
如果参数为空String(其长度为零),则结果为false;否则结果是真的。
对于第二个表达式,JavaScript在尝试比较不同数据类型的这些值时将执行类型强制。道格拉斯克罗克福德说this is a misfeature。如果您使用===
而不是==
,那将是错误的。规则相当复杂,因此您应该直接查看ECMA-262的第11.9.3节了解详细信息。