var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
我不想得到“推荐使用”的答案===
代替==
'。
我想了解一下这种现象的原因以及JavaScript的类型转换原理。
JS 中的类型转换,特别是在松散相等方面,是一个棘手的问题。
在回答“为什么这个特定的松散平等以这种方式评估”这个问题时,最好的起点总是咨询该表按操作数类型进行相等比较 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using.
在这种情况下,我们可以看到对于[] == false
,操作数 A 是一个对象,操作数 B 是一个布尔值,因此实际执行的比较将是ToPrimitive(A) == ToNumber(B)
.
右边很简单;ToNumber(false)
评估为0
。完成了,完成了。
左侧比较复杂;你可以检查官方 ECMAScript 规范 https://tc39.github.io/ecma262/#sec-toprimitive的完整文档ToPrimitive
,但你真正需要知道的是,在这种情况下,它归结为A.valueOf().toString()
,在空数组的情况下只是空字符串""
所以,我们最终评估了平等性"" == 0
。字符串/数字==
比较执行ToNumber
在绳子上,并且ToNumber("")
is 0
,所以我们得到0 == 0
,这当然是true
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)