[] == ![] 是 true是为什么?
首先计算 ![]
,[]
是一个正常的对象,是一个 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会尝试将它们转换为相同的类型,然后进行比较。
我们可以将[] == ![]
这个表达式分解为以下几个步骤:
![]
的计算结果是false
。这是因为在JavaScript中,非空数组在布尔上下文中被认为是真值(truthy),而!
操作符将其取反,得到false
。[]
和false
。由于它们的类型不同,JavaScript会尝试将它们转换为相同的类型。在这种情况下,两者都会被转换为数字。根据ECMAScript规范,空数组[]
转换为数字时等于0
,布尔值false
转换为数字时也等于0
。(0 == 0)
,所以[] == ![]
的结果为true
。这是一个典型的JavaScript类型转换和比较中的陷阱。为了避免这类问题,可以使用三等号===
进行严格的相等比较,这样就不会发生类型转换。在这种情况下,[] === ![]
的结果为 false,因为它们的类型不同。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.2k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
源于javascript的抽象相等比较算法规定,如下图
typeof ![]
是一个boolean
对象为false
。所以[] == ![]
其实就是[] == 0
[] == 0
就对应了第9条,然后[]
需要转为字符串再转为数值,才能和0
比较,所以又对应了第5条,'' == 0
=>0 == 0
截图的参考链接: https://262.ecma-internationa...