繁体   English   中英

为什么JavaScript中的null大于-1,小于1,但不等于(==)0? 那究竟是什么?

[英]Why is null in JavaScript bigger than -1, less than 1, but not equal (==) to 0? What is it exactly then?

从谷歌浏览器控制台:

var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false

将null的相等性与0进行比较时,结果为false。 如果强制在数字上下文中解释null ,则将其视为0,结果为true。

您可以通过将+放在前面或使用数字运算符(如<<=>>=强制它为数字。 注意null >= 0null <= 0都是如此。

> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true

ECMAScript语言规范定义何时执行所谓的“ToNumber”转换。 如果是,则null和false都转换为0。

§9.1类型转换和测试

表14 - 至数字转换

\n 参数类型结果\n ------------- ------\n 未定义的返回NaN\n  回报+0\n Boolean如果argument为true,则返回1。  如果参数为假,则返回+0。\n Number返回参数(无转换)。\n 字符串请参阅下面的语法和注释。\n

知道何时应用ToNumber转换取决于所涉及的操作员。 对于关系运算符<<=>>=请参阅:

§11.8.5抽象关系比较算法

比较x < y ,其中x和y是值,产生truefalseundefined (表示至少一个操作数是NaN )。 这样的比较如下进行:

  1. 调用ToPrimitive(x,提示编号)。

  2. 调用ToPrimitive(y,提示编号)。

  3. 如果Type(Result(1))是String并且Type(Result(2))是String,请转到步骤16.(请注意,此步骤与添加运算符+的算法中的步骤7的不同之处在于使用而不是或。 )

  4. 调用ToNumber(结果(1))。

  5. 调用ToNumber(结果(2))。

==运算符是不同的。 其类型转换如下所述。 注意null和false如何遵循不同的规则。

§11.9.3抽象等式比较算法

比较x == y,其中x和y是值,产生 这样的比较如下进行:

1.如果类型(x)与类型(y)不同,请转到步骤14。

...

14.如果x为null且y 未定义 ,则返回true

15.如果x 未定义且y为null ,则返回true

16.如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。

17.如果Type(x)是String而Type(y)是Number,则返回比较结果ToNumber(x)== y。

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

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

20.如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。

21.如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。

22.返回

如果仔细阅读,可以看到为什么false == 0为true但null == 0为false。

  • 对于false == 0 ,Type(x)是布尔值。 这意味着应用了步骤18的类型转换,并将false转换为数字。 ToNumber(false)为0,0 0 == 0为真,因此比较成功。

  • 对于null == 0 ,Type(x)为Null。 没有类型检查匹配,因此比较将进入步骤22,返回false。 比较失败。

null将数字转换为0作为数字: (+null)为0.>并且<cast null为此值,因此与数字进行比较时,它将作为零。 ==不会将null转换为数字,因此null == 0为false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM