为什么是[]==![]在JavaScript中是真的吗


var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???

我不想得到"建议使用===而不是=="的答案。我想知道出现这种现象的原因以及JavaScript的类型转换原理。

JS中的类型转换,特别是在松散等式方面,是一个棘手的问题。

在回答问题时,最好的起点是";为什么这种特殊的松散等式会这样评价";是按操作数类型查阅此相等比较表。

在这种情况下,我们可以看到,对于[] == false,操作数A是Object,操作数B是Boolean,因此实际执行的比较将是ToPrimitive(A) == ToNumber(B)

正确的一面很简单;5评估为CCD_ 6。完成了,完成了。

左侧更为复杂;您可以查看官方的ECMAScript规范以获取ToPrimitive的完整文档,但您真正需要知道的是,在这种情况下,它可以归结为A.valueOf().toString(),在空数组的情况下,CCD_8只是空字符串""

因此,我们最终评估了等式"" == 0。字符串/数字==比较对字符串执行ToNumber,而ToNumber("")0,所以我们得到0 == 0,当然是true

Double equals,==,在尝试检查相等性之前,会对值执行大量类型强制。

所以arr == arr会像你所期望的那样返回true,因为你实际检查的是[] == []和方程的两边是否属于同一类型。

CCD_ 20实际上是在检查CCD_。CCD_ 22然后对CCD_ 23值执行类型强制。正如哈姆斯所指出的,这并没有执行布尔转换,相反,[]被转换为基元,由于某些原因,它是一个空字符串。现在我们的方程是'' == false。这次行动双方的类型仍然不一样。因此,类型强制再次生效,由于javascript中的truthy和false值,''的计算结果也为false。方程现在变成了false == false,这显然是正确的。

最新更新