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

时间:2012-11-15 22:43:10

标签: javascript

从谷歌Chrome控制台:

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

2 个答案:

答案 0 :(得分:64)

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

您可以将+置于前面,或使用<<=>>=等数字运算符强制将其设为数字。请注意null >= 0null <= 0都是如此。

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

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

  

§9.1 Type Conversion and Testing

     

表14 - 至号码转化次数

Argument Type     Result
-------------     ------
Undefined         Return NaN
Null              Return +0
Boolean           Return 1 if argument is true. Return +0 if argument is false.
Number            Return argument (no conversion).
String            See grammar and note below.

知道何时应用ToNumber转换取决于相关运营商。对于关系运算符<<=>>=,请参阅:

  

§11.8.5 The Abstract Relational Comparison Algorithm

     

比较x < y,其中x和y是值,会产生 true false ,   或未定义(表示至少有一个操作数 NaN )。这样   比较如下:

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

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

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

  6.   
  7. 致电ToNumber(结果(1))。

  8.   
  9. 致电ToNumber(结果(2))。

  10.   

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

  

§11.9.3 The Abstract Equality Comparison Algorithm

     

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

     

1。如果Type(x)与Type(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

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

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

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

答案 1 :(得分:11)

null将数字转换为0作为数字:(+null)为0。和&lt;将null转换为此值,因此与数字进行比较时,它将作为零。 ==不会将null转换为数字,因此null == 0为false。