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
,这显然是正确的。