javascript比较危机

javascript比较危机,javascript,comparison,Javascript,Comparison,我遇到以下情况,无法理解原因,有人能解释一下吗 var foo = [0]; console.log(foo == !foo); // true console.log(foo == foo); // true 第二个比较很容易解释:foo等于它本身 然而,第一个问题有点棘手:foo是一个数组,它是一个对象,在执行时计算结果为true。所以!foo为假。但是比较左侧的foo未转换为布尔值。在相等比较期间,两个操作数实际上都转换为数字。这就是它的评估方法: [0] == false [0]

我遇到以下情况,无法理解原因,有人能解释一下吗

var foo = [0];
console.log(foo == !foo); // true 
console.log(foo == foo);  // true

第二个比较很容易解释:
foo
等于它本身

然而,第一个问题有点棘手:
foo
是一个数组,它是一个对象,在执行时计算结果为
true
。所以
!foo
。但是比较左侧的
foo
未转换为布尔值。在相等比较期间,两个操作数实际上都转换为数字。这就是它的评估方法:

[0] == false
[0] == 0
"0" == 0
0 == 0
true
根据,在与等式运算符比较时,
==

如果两个操作数的类型不同,JavaScript将转换操作数,然后应用严格比较。如果操作数是数字或布尔值,则如果可能,操作数将转换为数字

我知道这个解释听起来很肤浅。实际上要复杂得多,但基本步骤是我上面列出的。您可以查看ECMA-262规范的详细信息,特别是章节和

您应该使用“==”和“!==”而不是“==”和“!=” 更多解释如下:


:-)作为旁注-在JavaScript中,当使用==作为比较时,通常会得到意外的结果。你应该总是用===代替,因为它不使用类型转换。类型强制:@PhillipKregg,所以我们可以总是用===代替==?@Ansu-这是Crockford建议的。除非你有特定的理由不使用===,否则始终使用===是一个安全的赌注。他不是在问该做什么,而是在试图弄清是什么导致了这一点。是的,第一个链接给出了解释