我遇到以下情况,无法理解原因,谁能解释一下?
var foo = [0];
console.log(foo == !foo); // true
console.log(foo == foo); // true
我遇到以下情况,无法理解原因,谁能解释一下?
var foo = [0];
console.log(foo == !foo); // true
console.log(foo == foo); // true
第二个比较很容易解释:foo
等于自身。
然而,第一个有点棘手:foo
它是一个数组,它是一个对象,true
当被强制为 boolean时,它的计算结果为。!foo
也是如此false
。但是foo
左侧的比较没有被转换为布尔值。在相等比较期间,两个操作数实际上都转换为数字。这是它的评估方式:
[0] == false
[0] == 0
"0" == 0
0 == 0
true
根据MDN,与相等运算符的比较==
:
如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为数字
我知道这个解释听起来很肤浅。它实际上比这要复杂得多,但基本步骤是我上面列出的那些。您可以查看 ECMA-262 规范的详细信息,尤其是第9节和第11.9节。
您应该使用 "===" 和 "!==" 而不是 "==" 和 "!=" 更多解释: JavaScript 比较中应该使用哪个等号运算符 (== vs ===)?
http://net.tutsplus.com/tutorials/javascript-ajax/the-10-javascript-mistakes-youre-making/