比较null和undefined与Java语言中的布尔值

问题描述 投票:0回答:1

根据ES5 section 11.9.3

如果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的第十个点返回[C​​0]还是我在这里遗漏了什么>

javascript ecmascript-6 equality ecmascript-5 ecma
1个回答
1
投票

基本来说,是的,您正确地将falsefalsenull以外的任何内容进行比较时得到了null,因为您到达了算法的最后一步,即undefined

如果您问为什么return falsenull == false,简短的答案是:因为false只是null ==null

长答案是在您所指向的抽象相等操作中,这是最新版本:undefined步骤1-8不适用,而步骤9适用:

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

(ToNumber之前的https://tc39.es/ecma262/#sec-abstract-equality-comparison没有取反,它是有关突然完成的规范注释。这有时会使人感到困惑。]

所以现在有了!。步骤1至12均不适用,因此步骤13中的null == 0适用。

(我应该注意,即使return falsex,当nulltypeof null时,步骤11中的“如果Type(x)为对象”也不成立。 t与"object"相同,Type(null)为Null。)

您在评论中说:

我只是对null比较感到好奇,所以我提到了所有有问题的null比较。

是的,你说对了,你最终会走到尽头。该算法中与Type operation相关的唯一部分是步骤2和步骤3,它们检查一个操作数是否为typeof,另一个操作数是否为null,如果是则返回null

© www.soinside.com 2019 - 2024. All rights reserved.