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

10
据我所知,在JavaScript中,!!运算符可以将其他类型的值转换为布尔类型,并将其规范化为true或false。这意味着"0"会转换为布尔值true。另一方面,如果我将它与false比较,结果为true,实际上是false。我错过了什么规则?我已经在IE和Opera中测试过了。

可能是Boolan(!x)和Boolean(x==0)之间的区别?的重复问题。 - SLaks
3个回答

10

== 运算符检查松散相等性,与真值无关。

具体来说,它将操作数转换为数字,然后比较数字。
包含数字的字符串转换为它们所包含的数字;布尔值转换为 01
对象通过调用 valueOf 来进行转换(如果已被定义)。

因此,以下所有语句均为真:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true

9
在第一种情况下,非空字符串等同于true。
在第二种情况下,因为一个操作数是布尔值,所以两个操作数都被转换为数字值。我认为false转换为数字值0,字符串"0"也转换为数字0,结果为0 == 0,这是true。
查看Mozilla参考中的运算符行为。

谢谢您对我的回答的评论,这很有道理。发现得好!给您加一分,先生。 - wsanville

2
对于第一个表达式,ECMA-262的第9.2节定义了一个抽象操作ToBoolean,它由逻辑非运算符在内部使用。它说:
字符串
如果参数是空字符串(长度为零),则结果为false;否则结果为true。
对于第二个表达式,在尝试比较不同数据类型的值时,JavaScript将执行类型强制转换。Douglas Crockford说这是一个不好的特性this is a misfeature。如果你使用 === 而不是 == ,它将会是false。规则相当复杂,因此你应该直接查看ECMA-262的第11.9.3节以获取详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接