为什么alert(!!“0”)和alert(false ==“0”)都在JavaScript中输出true

时间:2010-12-31 00:58:52

标签: javascript

据我所知,在JavaScript!应该规范化一个布尔值,将其从某个其他类型转换为true或false。这意味着“0”转换为布尔值true。另一方面,如果我将它与false进行比较,事实证明它实际上是假的(因为比较的结果是真的)。我在这里错过了什么规则。我已经在IE和Opera中测试了它。

3 个答案:

答案 0 :(得分:10)

==运算符检查松散的平等,这与真实性无关。

具体来说,它会将操作数转换为数字,然后比较数字 包含数字的字符串会转换为它们包含的数字;布尔值转换为01 如果已定义,则通过调用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节了解详细信息。