在 Javascript 中,在对象到布尔的情况下,类型强制如何
How does Type Coercion in Javascript in the case of object to boolean?
据我所知,(x == false)
应该做与!x
相同的事情,因为他们都试图将x
解释为布尔值,然后否定它。
然而,当我试图测试这一点时,我开始出现一些非常奇怪的行为。
例如:
false == []
和 false == ![]
都返回 true。
此外
false == undefined
和 true == undefined
都返回 false,也是如此
false == Infinity
和true == Infinity
和
false == NaN
和true == NaN
.
这到底是怎么回事?
http://jsfiddle.net/AA6np/1/
都在这里:http://es5.github.com/#x11.9.3
对于false == []
的情况:
-
false
转换为数字 (0),因为这总是用布尔值完成的。 - [] 通过调用
[].valueOf().toString()
转换为原语,这是一个空字符串。 - 然后通过将空字符串转换为数字来计算
0 == ""
,并且由于其结果也是 0,因此false == []
为 true。
对于false == ![]
的情况:
- 逻辑非运算符
!
通过返回与ToBoolean(GetValue(expr))
相反的内容来执行 -
ToBoolean()
对于任何对象总是为真,因此![]
计算结果为false
(因为!true = false
),因此false == ![]
也为真。
(false == undefined) === false
和(true == undefined) === false
更简单:
-
false
和true
再次转换为数字(分别为 0 和 1)。 - 因为 undefined 无法与数字进行比较,所以链冒泡到默认结果,即
false
。
其他两种情况的计算方式相同:首先将布尔值与数字进行比较,然后将其与另一个数字进行比较。由于 0 和 1 都不等于无穷大或不是数字,因此这些表达式的计算结果也为 false
。
抽象相等算法在规范的第 9.3 节中描述。
对于 x = false
且 y = []
的x == y
:
- 不。类型不相等。
- 不,x 不为空。
- 不,x不是未定义的。
- 不,x 不是数字
- 不,x 不是字符串。
- 是的,x 是一个布尔值,所以我们比较 ToNumber(x) 和 y。
重复算法,x= 0
和 y= []
。
我们在步骤 8:Type(x) == 数字结束。和 Type(y) == 对象。
因此,让结果为 x == ToPrimitive(y)。
ToPrimitive([]) == "
现在,再次重复该算法,使用 x= 0
和 y= ""
。我们以 4 结尾:"返回比较结果 x == ToNumber(y)。
ToNumber(") == 0
算法的最后一次重复在步骤 1 结束(类型相等)。通过 1.c.iii,0 == 0,返回 true。
通过使用算法,可以以类似的方式获得其他结果。
false == []
使用==
Javascript 可以应用转换。该对象将转换为基元以将类型与布尔值匹配,留下一个空字符串。假将转换为数字 0。比较空字符串和数字 0。字符串将转换为将为 0 的数字,因此表达式为"true"
![]
Javascript 将对象转换为布尔值 true,因此否认 true 结束为假。
false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN
又有点相同!false 转换为 0,true 转换为 1。然后,未定义被转换为一个数字,即...南!无论如何都是错误的
我建议尽可能多地使用=== !==
来获得"预期"的结果,除非您非常清楚自己在做什么。使用类似 Boolean(undefined) == fals
e 的东西也会很好。
在转换内容时检查 ECMAScript 规范以了解所有细节。
- 如何解决这种情况下的非法调用类型错误
- 类型胁迫在有条件的情况下更危险吗?
- 可以在不使用exports命令的情况下编写此类型脚本
- 在 Javascript 中,在对象到布尔的情况下,类型强制如何
- 如何在不更改属性数据类型的情况下推送对象数组
- 如何在没有输入的情况下发送文件[类型=“文件”]
- 如何在不使用 Blob 的情况下将内容类型添加到多部分请求
- 在不使用JQuery并且具有输入类型=“0”的情况下阻止表单的提交;提交”;
- 如何在不获取所有项目的情况下获取特定内容类型的列表项的计数
- 如何在不使用输入类型=“*”的情况下将文本转换为*;密码”;
- 为什么javascript检查类型在null情况下甚至使用==
- 如何在没有任何名称空间冲突的情况下获得Javascript中的哈希表或记录类型
- JavaScript for loop:为什么在这种情况下索引字符串的类型
- "最大长度“;在输入类型=“0”的情况下不工作;数字“;在html文本框中
- 是否可以像在Javascript对象中那样将整数值存储在localStorage中,并在不进行类型转换的情况下提取它
- Sencha默认情况下将只读属性添加到'外部字段编号'类型
- 如何在没有表单提交的情况下使用jquery从文件输入类型中获取文件名
- 如何在没有空数组的情况下从JSON结果中过滤出特定的地址类型?
- 在不改变值的情况下格式化输入类型文本
- 如何在不改变a的定义的情况下让Flow相信类型a是抽象类型B的子类型