javascript - 为什么 [] == ![] 在 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。字符串/数字==比较对字符串执行ToNumberToNumber("")0,所以我们得到 0 == 0,这当然是 true

关于javascript - 为什么 [] == ![] 在 JavaScript 中为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51549267/

相关文章:

javascript - 将 id 从 php while 循环传递给 jquery

javascript - AJAX (JavaScript/PHP),FormData 不发送

javascript - 根据 React 中不同字段的不同文本输入进行过滤

javascript - 如何在 Django 中使用自定义表单访问和处理数据

javascript - Meteor 方法 404 错误但登录控制台

javascript - 为什么js图像对象没有被垃圾回收?

javascript - XML用双引号存储文本数据,JavaScript在检索数据时崩溃

javascript - 如何处理IE10的触摸事件?

javascript - vue - 删除最新的子路径

javascript - 重用需要 `ui-route` d 参数的 `resolve` Controller