JavaScipt的数据类型转换对于“==”运算符究竟是如何工作的

How exactly does JavaScipt's data-type convertion work for "==" operator?

本文关键字:何工作 工作 究竟 类型转换 数据 JavaScipt 运算符      更新时间:2023-09-26

我最近在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 是如何尝试转换这些项目的?它是否试图将布尔值转换为numberstring

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

编辑:我想指出,虽然我确实在我的问题中使用了!!,但它只是为了表明,如果我将给定的数据类型转换为布尔值,它们确实会变成 true,而当==尝试转换时,结果是不同的。这个问题绝不是在问!!是什么。

正如克罗克福德所说:"他们这样做的规则是复杂而令人难忘的。该规范在第 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中所说,这是错误的。

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

在我看来

==的意思是"评估到相同的值"。 42 不等于 true,因为 true 正在转换为整数进行比较,并且42 != 1 . 但是,如果人们想将 42 转换为布尔值,只需执行if (42),或者您可以执行!!而不是不欺骗。 大多数人只是做if (42),将非零,非空的值转换为带有括号的布尔值。

仅当x预期为 0 或 1 或 true 或 false 时,才应使用 (x == true)

我想你已经知道=====之间的区别了。

(1 == true) // true
(1 === true) // false, because data types aren't converted when using ===

有关自动类型转换和赋值快捷方式的更多信息,建议阅读此页面。 虽然它没有具体回答您的问题,但它确实提供了示例,说明何时应该具体说明要测试的内容。