为什么 0 == [],但是 0 == false 和 ![] == false?

5

至少在JavaScript中,以下是真实的:

0 == []       // true
0 == false    // true
![] == false  // true

为什么会这样?我知道==表示相等但不考虑类型,但在false == true的情况下,这句话是怎么说的呢?

7
你在哪里得出 [] == true 的结论,因为它应该是 false - Matt Burland
3
@FrederikWitte:这与你在问题中输入的内容完全不同。[] == true![]不是相同的操作。 - Matt Burland
4
JavaScript,所以如此。 - Dave Newton
2
实际上,类型转换在实践中是有意义的,但在人为构造的示例中看起来很愚蠢。 - dandavis
2
当混合类型时,JavaScript的==运算符不能保证是传递性的 - Nayuki
显示剩余12条评论
2个回答

3

当使用非严格相等运算符时,JavaScript将对象强制转换为布尔值。

该句话涉及到IT技术相关内容。
0 == []

因为JavaScript将这两个值(它们都不是相同类型)强制转换为布尔值进行比较。换句话说,false == false
如果使用===,则正在检查对象的相等性。
一个有趣的用例是这个:
[] === []; // => false

这是因为===检查的是对象的内存位置。两个数组没有共享相同的内存位置。但是:
var arr = [];

arr === arr; // ==> true

但是,这里有另一个有趣的转折:

1 === 1; // ==> true

在处理数组和普通对象时,JavaScript 引用内存位置。但是对于像字符串和数字这样的值,JavaScript 会使用 === 运算符检查它们是否完全相等。因此,重要的区别在于 ===== 之间的差异,以及 JavaScript 如何强制类型转换。
提示:这就是为什么通常建议使用严格的 === 运算符,如果需要防止强制类型转换(然而,有时强制类型转换可以对您有益,例如在解决跨浏览器问题时,一个值可能在一个浏览器中是undefined,在另一个浏览器中是null。然后你可以说类似于 !!thatStrangeValue,这样,undefinednull 将被强制转换为相同的值)。
编辑
OP 提出了一个很好的观点:
[] == false;
![] == false;

上述陈述都是正确的,这很奇怪。我会说第一句话检查是否为空,而第二句话检查是否存在。有人知道最后一个问题的答案吗?

1
优秀且深思熟虑的文章。但需要记住的是,相等和严格相等之间存在差异。对于新手来说,这可能有些具有挑战性。 - Richard Hamilton
谢谢您的回答和见解,但是它缺少一个要点,为什么! [] == false,而0 == []? - Frederik Witte
@FrederikWitte,谢谢。是的,你说得很对。我编辑了我的答案,给出了一个具体的例子,说明了问题所在。不过,我不确定最后一个问题的答案是什么。 - Josh Beam

1
在JavaScript中,有两种相等的类型。一种是值相等,用==表示;另一个是值和类型都相等,用===表示。后者是严格相等运算符。
在您的情况下,我们仅通过值来检查相等性,而不考虑类型。 []代表一个空对象,意味着[]0具有相同的值。
在JavaScript中,任何大于或等于1的数字的值为true,而0的值为false
希望这能帮到您。

1
我理解了直到“[]也是false,而not false总是返回true”的那一点。 - Frederik Witte
这是布尔逻辑的一部分。not false 等于 true - Richard Hamilton
非假即真,!false 表示的是 false 的相反值。而 false 的相反值就是 true。因此,!false === true - Josh Beam
是的,但你有点写成了“[] is FALSE and NOT FALSE”?我希望你能理解这里让我感到困惑的地方。 - Frederik Witte
抱歉,我在这里搞混了。我删除了那部分。 - Richard Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接