我在JavaScript中使用if( ... == true)
时发现了一些奇怪的事情。 ==
运算符应尝试将给定的数据类型转换为相同。但是有些案例似乎没有像我们预期的那样做到:
if ( 42 == true ) // false ( Only 1 is true )
if ( "Hello World" == true ) // false ( false for any string )
虽然如果我自己将!!
同时转换为42
和"someString"
,则转为true
:
if ( !!42 === true ) // Shows that 42 cast to a boolean is true.
if ( !!"Hello World" === true ) // Same for strings
请注意,如果我在if( true == ... )
周围切换,结果是相同的。我想确切地知道这里发生了什么,为什么==
在将这些项目转换为true
时奇怪地转换这些项目。 JavaScript如何尝试转换这些项目?是否尝试将布尔值转换为number
或string
?
我的主要问题是,当试图将不同的数据类型转换为表达式中的相同时,JavaScript等于运算符(==
)是如何工作的,在这种情况下布尔值在表达式中?
编辑:我想要注意的是,虽然我在问题中使用了!!
,但这只是为了表明如果我将给定的数据类型转换为布尔值,他们确实会转出通过true,当==
尝试转换结果时不同。这个问题绝不会询问!!
是什么。
答案 0 :(得分:6)
正如克罗克福德所说:“他们这样做的规则既复杂又不可取。”规范定义了所有in section 11.9.3(由@Oriol在对OP的评论中指出)。
对于您提供的两个案例:
if ( 42 == true ) // false ( Only 1 is true )
if ( "Hello World" == true ) // false ( false for any string )
在情况1中, y 是布尔值,因此它被转换为数字(步骤7)。 true
的转换次数为1.所以现在我们正在评估42 == 1
。这显然是错误的。
在案例2中, y 再次是布尔值,但这次 x 是一个字符串。根据步骤7, y 将转换为数字,因此现在进行比较"Hello World" == 1
。根据步骤5, x 现在转换为数字。任意字符串的数字表示为NaN
。现在正在比较NaN == 1
。正如它在步骤1ai中所说,这是错误的。
再次,正如克罗克福德所说的那样......
答案 1 :(得分:-1)
在我看来,==
表示“评估为相同的值”。 42不等于true,因为true被转换为整数用于比较,42 != 1
。但是,如果人们想要将42转换为布尔值,只需执行if (42)
,或者您可以执行!!
并非技巧。大多数人只是做if (42)
,将非零,非空值转换为带括号的bool。
(x == true)
预期为0或1,或者为真或假时,才应使用 x
。
我知道==
和===
之间存在差异。
(1 == true) // true
(1 === true) // false, because data types aren't converted when using ===
有关自动类型转换和分配快捷方式的详细信息,建议reading this page。虽然它没有具体回答您的问题,但它确实提供了一些示例,说明何时应该针对您要测试的内容进行具体说明。