[] == ![] 是 true是为什么?

[] == ![] 是 true是为什么?
image.png

阅读 8.3k
6 个回答

源于javascript的抽象相等比较算法规定,如下图

image.png

  • 从第7条开始:typeof ![] 是一个 boolean 对象为 false。所以 [] == ![] 其实就是 [] == 0
  • [] == 0 就对应了第9条,然后 [] 需要转为字符串再转为数值,才能和 0 比较,所以又对应了第5条,'' == 0 => 0 == 0
  • 所以最终结果为true

截图的参考链接: https://262.ecma-internationa...

首先计算 ![][] 是一个正常的对象,是一个 truthy 值,所以 ![]false

这样问题变成了如何比较 []false,因为它们不是一个类型,所以会先尝试转换到 number 类型。(JS 规范明确了双等号比较的流程)

false 转为 number 显然是 0

[] 先转为 string 才能转为 number,[] 转为 string 是空字符串 "",再转为 number 是 0

现在比较两个 number,都是 0,所以 [] == ![]true

引用自:https://github.com/denysdovhan/wtfjs/blob/master/README-zh-cn.md

💡 说明:
抽象相等运算符会将其两端的表达式转换为数字值进行比较,尽管这个例子中,左右两端均被转换为 0,但原因各不相同。数组总是真值(truthy),因此右值的数组取反后总是为 false,然后在抽象相等比较中被被类型转换为 0。而左值则是另一种情形,空数组没有被转换为布尔值的话,尽管在逻辑上是真值(truthy),但在抽象相等比较中,会被类型转换为数字 0。

这个仓库中还包含了很多 JS 中奇怪的东西以及对应的解释。

使用 == javascript 会对两边进行强制类型转换
[]===![]
就是false了

虽然[]等于false,但是它的计算结果确是true,所以![]是 false

结果就是[]==![] 为true

因为false==false 为true

新手上路,请多包涵

这个表达式的结果是 true,是因为 JavaScript 中的运算符优先级和类型转换规则导致的。
首先,运算符 ! 的优先级高于 ==,因此该表达式可以转化为 [] == false,再根据 JavaScript 中的隐式类型转换规则,当使用==运算符进行比较时,如果比较的两个值类型不同,则需要进行类型转换,将其转换为相同的类型再进行比较。此外,任何对象在布尔上下文中都会被转换为 true,也就是说 ![] 转换为布尔类型的值为 false,而空数组[]在转换为数值类型时会被转换为0,因此此时 [] == false 可以转换为 0 == 0,结果为 true。
总结起来,当我们执行 [] == ![] 时,JavaScript先将 ![] 转为布尔类型的 false,然后再将数组 [] 转为数值类型的 0,因为 JavaScript 中 0 与 false 是相等的,所以最终返回 true。

要理解为什么在JavaScript中[] == ![]true,需要了解一下JavaScript的类型转换和比较操作。当使用双等号==进行比较时,如果两边的操作数类型不同,JavaScript会尝试将它们转换为相同的类型,然后进行比较。

我们可以将[] == ![]这个表达式分解为以下几个步骤:

  1. ![]的计算结果是false。这是因为在JavaScript中,非空数组在布尔上下文中被认为是真值(truthy),而!操作符将其取反,得到false
  2. 接下来,我们需要比较[]false。由于它们的类型不同,JavaScript会尝试将它们转换为相同的类型。在这种情况下,两者都会被转换为数字。根据ECMAScript规范,空数组[]转换为数字时等于0,布尔值false转换为数字时也等于0
  3. 由于转换后的值相等(0 == 0),所以[] == ![]的结果为true

这是一个典型的JavaScript类型转换和比较中的陷阱。为了避免这类问题,可以使用三等号===进行严格的相等比较,这样就不会发生类型转换。在这种情况下,[] === ![]的结果为 false,因为它们的类型不同。

推荐问题
宣传栏