我遇到了以下问题,无法理解原因,有人可以解释一下吗?
var foo = [0];
console.log(foo == !foo); // true
console.log(foo == foo); // true
第二个比较解释起来很简单:foo
等于它本身。
然而,第一个有点棘手:foo
是一个数组,它是一个对象,其计算结果为true
when 强制为布尔值 http://ecma-international.org/ecma-262/5.1/#sec-9. So !foo
is false
. But foo
比较左侧没有转换为布尔值。在相等比较期间,两个操作数实际上都转换为数字。它的评估方式是这样的:
[0] == false
[0] == 0
"0" == 0
0 == 0
true
根据MDN https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Comparison_Operators,与相等运算符比较==
:
如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则如果可能,操作数将转换为数字
我知道这个解释听起来很肤浅。实际上比这复杂得多,但基本步骤就是我上面列出的步骤。您可以查看 ECMA-262 规范的详细信息,特别是各个部分9 http://ecma-international.org/ecma-262/5.1/#sec-9 and 11.9 http://ecma-international.org/ecma-262/5.1/#sec-11.9.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)