在 Javascript 中,在对象到布尔的情况下,类型强制如何

How does Type Coercion in Javascript in the case of object to boolean?

本文关键字:类型 情况下 布尔 Javascript 对象      更新时间:2023-09-26

据我所知,(x == false)应该做与!x相同的事情,因为他们都试图将x解释为布尔值,然后否定它。

然而,当我试图测试这一点时,我开始出现一些非常奇怪的行为。

例如:

false == []false == ![] 都返回 true。

此外

false == undefinedtrue == undefined 都返回 false,也是如此

false == Infinitytrue == Infinity

false == NaNtrue == 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更简单:

  • falsetrue 再次转换为数字(分别为 0 和 1)。
  • 因为 undefined 无法与数字进行比较,所以链冒泡到默认结果,即false

其他两种情况的计算方式相同:首先将布尔值与数字进行比较,然后将其与另一个数字进行比较。由于 0 和 1 都不等于无穷大或不是数字,因此这些表达式的计算结果也为 false

抽象相等算法在规范的第 9.3 节中描述。

对于 x = false 且 y = []x == y

  1. 不。类型不相等。
  2. 不,x 不为空。
  3. 不,x不是未定义的。
  4. 不,x 不是数字
  5. 不,x 不是字符串。
  6. 是的,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 规范以了解所有细节。

相关文章: