将 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 点还是我在这里遗漏了什么>
从根本上说,是的,当将 null
与 null
或 undefined
以外的任何内容进行比较时,您得到 false
是正确的,因为您到达了算法的最后一步,即 return false
.
如果你问为什么 null == false
是 false
,简短的回答是:因为 null
只是 ==
null
和 undefined
.
长答案在您指出的抽象相等操作中,这是最新版本:https://tc39.es/ecma262/#sec-abstract-equality-comparison第 1-8 步不适用,但第 9 步适用:
- If Type(y) is Boolean, return the result of the comparison x == ! ToNumber(y).
(ToNumber 之前的 !
不是否定,它是关于突然完成的规范注释。这有时会让人感到困惑。)
所以现在我们有 null == 0
。步骤 1-12 的 None 适用,因此步骤 13 中的 return false
适用。
(我应该注意到,当 x
为 null
时,步骤 11 中的 "If Type(x) is Object" 不正确,即使 typeof null
为 "object"
。Type operation 与 typeof
不同,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
如果是的话。
根据 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 点还是我在这里遗漏了什么>
从根本上说,是的,当将 null
与 null
或 undefined
以外的任何内容进行比较时,您得到 false
是正确的,因为您到达了算法的最后一步,即 return false
.
如果你问为什么 null == false
是 false
,简短的回答是:因为 null
只是 ==
null
和 undefined
.
长答案在您指出的抽象相等操作中,这是最新版本:https://tc39.es/ecma262/#sec-abstract-equality-comparison第 1-8 步不适用,但第 9 步适用:
- If Type(y) is Boolean, return the result of the comparison x == ! ToNumber(y).
(ToNumber 之前的 !
不是否定,它是关于突然完成的规范注释。这有时会让人感到困惑。)
所以现在我们有 null == 0
。步骤 1-12 的 None 适用,因此步骤 13 中的 return false
适用。
(我应该注意到,当 x
为 null
时,步骤 11 中的 "If Type(x) is Object" 不正确,即使 typeof null
为 "object"
。Type operation 与 typeof
不同,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
如果是的话。