<分区>
var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
我不想得到“建议使用 ===
而不是 ==
”的答案。
想知道造成这种现象的原因和JavaScript类型转换的原理。
标签 javascript
<分区>
var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
我不想得到“建议使用 ===
而不是 ==
”的答案。
想知道造成这种现象的原因和JavaScript类型转换的原理。
最佳答案
JS 中的类型转换,特别是在松散相等方面,是一个棘手的野兽。
在回答“为什么这种特殊的松散相等性以这种方式计算”这个问题时,最好的起点是咨询 this table of equality comparisons by operand type .
在这种情况下,我们可以看到对于 [] == false
,操作数 A 是一个对象而操作数 B 是一个 bool 值,因此实际执行的比较将是 ToPrimitive (A) == ToNumber(B)
。
右边很简单; ToNumber(false)
的计算结果为 0
。大功告成。
左边比较复杂;你可以查看the official ECMAScript spec对于 ToPrimitive
的完整文档,但您真正需要知道的是,在这种情况下它归结为 A.valueOf().toString()
,在这种情况下空数组只是空字符串 ""
因此,我们最终评估了相等性 ""== 0
。字符串/数字==
比较对字符串执行ToNumber
,ToNumber("")
为0
,所以我们得到 0 == 0
,这当然是 true
。
关于javascript - 为什么 [] == ![] 在 JavaScript 中为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51549267/