var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???我不想得到‘推荐使用===而不是==’的答案。我想知道出现这种现象的原因以及JavaScript的类型转换原理。
发布于 2018-07-27 09:24:14
JS中的类型转换,特别是在松散相等方面,是一个棘手的问题。
在回答“为什么这个特殊的松散相等以这种方式求值”这个问题时,最好的起点是咨询this table of equality comparisons by operand type。
在本例中,我们可以看到,对于[] == false,操作数A是一个对象,操作数B是一个布尔值,因此实际执行的比较将是ToPrimitive(A) == ToNumber(B)。
右边很简单;ToNumber(false)的计算结果是0。完事了。
左侧更为复杂;您可以在the official ECMAScript spec中查看ToPrimitive的完整文档,但您真正需要知道的是,在本例中,它归结为A.valueOf().toString(),在空数组的情况下,它就是空字符串""
因此,我们最终评估相等的"" == 0。字符串/数字==比较对字符串执行ToNumber,ToNumber("")为0,因此我们得到0 == 0,当然是true。
https://stackoverflow.com/questions/51549267
复制相似问题