JavaScipt的数据类型转换究竟对"=="运算符有效吗?

Spe*_*rek -2 javascript equality type-conversion

我最近if( ... == true)在JavaScript中使用时发现了一些奇怪的东西.该==运营商应该尝试转换给定的数据类型是相同的.但有些情况似乎没有像我们预期的那样做:

if ( 42 == true ) // false ( Only 1 is true )
if ( "Hello World" == true ) // false ( false for any string )
Run Code Online (Sandbox Code Playgroud)

虽然如果我将它们自己转换!!成两者42并且"someString"结果是true:

if ( !!42 === true ) // Shows that 42 cast to a boolean is true.
if ( !!"Hello World" === true ) // Same for strings
Run Code Online (Sandbox Code Playgroud)

请注意,如果我切换它if( true == ... ),结果是相同的.我想知道这里到底发生了什么,为什么==当他们确实转换成这些物品时会奇怪地转换它们true.JavaScript如何尝试转换这些项目?它是否试图将布尔值转换为a number或者string相反?

我的主要问题是,==当试图将不同的数据类型转换为表达式中的相同时,JavaScript等于operator()是如何工作的,在这种情况下布尔值在表达式中?

编辑:我想要注意的是,虽然我!!在我的问题中使用过,但它只是表明如果我将给定的数据类型转换为布尔值,它们确实转向true,而当==转换结果的尝试不同时.这个问题绝不是在询问是什么!!.

Sci*_*ter 6

正如克罗克福德所说:"他们这样做的规则是复杂而不可取的." 规范在第11.9.3节中定义了它们(由@Oriol在对OP的评论中指出).

对于您提供的两种情况:

if ( 42 == true ) // false ( Only 1 is true )
if ( "Hello World" == true ) // false ( false for any string )
Run Code Online (Sandbox Code Playgroud)

在情况1中,y是布尔值,因此它被转换为数字(步骤7).数字转换true为1.所以现在我们正在评估42 == 1.这显然是错误的.

在情况2中,y又是布尔值,但这次,x是一个字符串.根据步骤7,y被转换为数字,因此现在进行比较"Hello World" == 1.根据步骤5,x现在转换为数字.任意字符串的数字表示是NaN.现在NaN == 1正在进行比较.正如它在步骤1ai中所说,这是错误的.

再一次,正如克罗克福德所说......