JavaScipt的数据类型转换对于“==”运算符究竟是如何工作的
How exactly does JavaScipt's data-type convertion work for "==" operator?
我最近在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 等于运算符 ( ==
) 在尝试将不同的数据类型转换为表达式中相同时,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 ===
有关自动类型转换和赋值快捷方式的更多信息,建议阅读此页面。 虽然它没有具体回答您的问题,但它确实提供了示例,说明何时应该具体说明要测试的内容。
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- 在JavaScript中的类中,push和concat的工作方式有何不同