什么是!0在JavaScript中使用==进行比较时转换为?

Aks*_*tap 0 javascript comparison conditional

我在控制台中搞了几件事.

!5 is actually false
0 is a falsy value, so
0 == !5 is true
Run Code Online (Sandbox Code Playgroud)

好的,但是当我尝试这个时

!0 is true
5 is a truthy, so
5 == !0 should be true
Run Code Online (Sandbox Code Playgroud)

但它没有,控制台说错了.为什么会这样?

小智 5

最后一行的原因false是它==不是一个简单的布尔转换.它通常会尝试将非匹配类型的操作数转换为数字.

因此,5不需要转换,因为它已经是一个数,但是!0,这是true,不.该值true将转换为1,因此它不相等5.

你可以从中推断出1 == !0它将是true,实际上它是.

这在抽象等效比较算法的步骤7 中的ES5规范中有详细说明,其中说明了比较x == y:

如果Type(y)是布尔值,则返回比较结果x == ToNumber(y).

所以右手布尔值被强制转换为ToNumber的数字.在这种情况下,ToNumber说:

如果参数为真,则结果为1.