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建议的。除非你有特定的理由不使用===,否则始终使用===是一个安全的赌注。他不是在问该做什么,而是在试图弄清是什么导致了这一点。是的,第一个链接给出了解释