如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。如果Type(y)为布尔型,则返回比较结果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
返回false的情况,false
被强制转换为0
的数字,因此比较将变为a == 0
,然后对于下一个强制类型为null == 0
的强制,则为null应该被强制为Number
,即0
。因此,最后它应该为0 == 0
返回true。
我从ES5 11.9.3获得的是
如果x为null且y未定义,则返回true。如果x未定义且y为null,则返回true。
提及null和未定义。
ES 11.9.3部分的第10点指出,如果您的比较没有超过9个标准return false
。
我的比较是根据ES5 11.9.3的第十个点返回[C0]还是我在这里遗漏了什么>
基本来说,是的,您正确地将false
与false
或null
以外的任何内容进行比较时得到了null
,因为您到达了算法的最后一步,即undefined
。
如果您问为什么return false
是null == false
,简短的答案是:因为false
只是null
==
和null
。
长答案是在您所指向的抽象相等操作中,这是最新版本:undefined
步骤1-8不适用,而步骤9适用:
- 如果Type(y)为布尔值,则返回比较结果x ==! ToNumber(y)。
(ToNumber之前的https://tc39.es/ecma262/#sec-abstract-equality-comparison没有取反,它是有关突然完成的规范注释。这有时会使人感到困惑。]
所以现在有了!
。步骤1至12均不适用,因此步骤13中的null == 0
适用。
(我应该注意,即使return false
为x
,当null
为typeof null
时,步骤11中的“如果Type(x)为对象”也不成立。 t与"object"
相同,Type(null)为Null。)
您在评论中说:
我只是对null比较感到好奇,所以我提到了所有有问题的null比较。
是的,你说对了,你最终会走到尽头。该算法中与Type operation相关的唯一部分是步骤2和步骤3,它们检查一个操作数是否为typeof
,另一个操作数是否为null
,如果是则返回null
。