将 null 和 undefined 与 Javascript 中的布尔值进行比较

Comparing null and undefined with booleans in Javascript

根据 ES5 section 11.9.3 它说

If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

当我试图比较时

let a = null, b = null;

a == false; // false
b == false; // false
a == "";    // false
b == "";    // false
a == 0;     // false
b == 0;     // false

我在这里期待的是,a == false returning false 是,false 被强制转换为 0 的数字,因此比较将变为 a == 0 然后对于类型为 null == 0 的下一个强制转换,null 应该被强制转换为 Number,即 0。所以最后它应该 return 对 0 == 0 为真。

我从 ES5 11.9.3 得到的是

If x is null and y is undefined, return true.
If x is undefined and y is null, return true.

提到了 null 和 undefined。

ES 11.9.3 部分的第 10 点说,如果您的比较没有超过 9 个标准 return false

我的比较 returning false 是根据 ES5 11.9.3 中的第 10 点还是我在这里遗漏了什么>

从根本上说,是的,当将 nullnullundefined 以外的任何内容进行比较时,您得到 false 是正确的,因为您到达了算法的最后一步,即 return false.

如果你问为什么 null == falsefalse,简短的回答是:因为 null 只是 == nullundefined.

长答案在您指出的抽象相等操作中,这是最新版本:https://tc39.es/ecma262/#sec-abstract-equality-comparison第 1-8 步不适用,但第 9 步适用:

  1. If Type(y) is Boolean, return the result of the comparison x == ! ToNumber(y).

(ToNumber 之前的 ! 不是否定,它是关于突然完成的规范注释。这有时会让人感到困惑。)

所以现在我们有 null == 0。步骤 1-12 的 None 适用,因此步骤 13 中的 return false 适用。

(我应该注意到,当 xnull 时,步骤 11 中的 "If Type(x) is Object" 不正确,即使 typeof null"object"Type operationtypeof 不同,Type(null) 为 Null。)

您在评论中说:

I was just curious about null comparisons, so I mentioned all null comparisons in question.

是的,你是对的,你最终走到了尽头。算法中与 null 相关的唯一部分是步骤 2 和 3,它们检查一个操作数是否为 null,另一个操作数是否为 undefined 和 return true 如果是的话。