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

时间:2015-05-21 19:15:46

标签: javascript

至少在JavaScript中,以下情况属实:

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

为什么?我知道==在类型上意味着等于但不等于,但在这种情况下,false == true怎么可能呢?

2 个答案:

答案 0 :(得分:3)

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

0 == []

因为JavaScript将两个值(两者都是相同类型的)强制转换为布尔值以进行比较。换句话说,false == false

另一方面,如果您使用===,则需要检查对象是否相等。

一个有趣的用例是:

[] === []; // => false

这是因为===正在检查对象的内存位置。两个阵列不共享相同的内存位置。但是:

var arr = [];

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

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

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

对于数组和普通对象,JavaScript引用内存位置。但是对于字符串和数字这样的值,JavaScript会检查这些值是否与===运算符完全相同。

因此,最大的区别在于=====的差异,以及JavaScript如何强制类型。

提示:这就是为什么通常建议您使用严格===运算符,如果您需要防止强制行为(但是,有时强制行为对您有利,例如,当处理跨浏览器问题时,一个浏览器中的值可能为undefined,而另一个浏览器中的值为null。然后您可以说!!thatStrangeValue之类的内容,{{1} }}和undefined将被强制执行相同的操作。)

修改

OP提出了一个很好的观点:

null

以上陈述都是正确的,这很奇怪。我会说第一个声明是检查空虚,而第二个是检查是否存在。有人知道最后一点的答案吗?

答案 1 :(得分:1)

在JavaScript中,有两种类型的相等。存在由==表示的值的相等性以及由===表示的值和类型的相等性。后者是严格的相等运算符。

在您的情况下,我们只是按值检查相等,而不是类型。

[]代表一个空对象,表示[]0具有相同的值。

在JavaScript中,任何大于或等于1的数字的值为true,值为0的值为false

希望这有帮助