为什么JavaScript中的[] ==![]为真?

msm*_*919 4 javascript

var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
Run Code Online (Sandbox Code Playgroud)

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

Ham*_*mms 7

JS中的类型转换,特别是关于松散的平等,是一个棘手的野兽.

在回答"为什么这个特殊的松散平等以这种方式评估"这个问题时总是开始的最好的地方是通过操作数类型来参考这个相等比较表.

在这种情况下,我们可以看到,对于[] == false,操作数A是一个对象而操作数B是一个布尔值,因此执行的实际比较将是ToPrimitive(A) == ToNumber(B).

右边很简单; ToNumber(false)评估为0.做完了.

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

所以,我们最终评估了平等"" == 0.一个字符串/数字==比较来执行ToNumber的字符串,ToNumber("")0的,所以我们得到0==0,这是当然的true.