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

Tot*_*.js 45 javascript

来自Google Chrome控制台:

var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 68

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

你可以迫使它通过将是数字+在前面,或通过使用数字运算符,例如<,<=,>,和>=.注意如何null >= 0并且null <= 0都是真的.

> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true
Run Code Online (Sandbox Code Playgroud)

的ECMAScript的语言规范当执行所谓的"ToNumber"的转换定义.如果是,则null和false都转换为0.

§9.1类型转换和测试:

表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抽象关系比较算法:

比较x < y,其中x和y是值,产生true,false或undefined(表示至少一个操作数是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是真的,但却null == 0是错误的.

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

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


tmc*_*mcw 12

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

  • 是的 - + 可用于快速将内容转换为数字:`(+new Date())` 是获取毫秒时间的常见技巧。例如,`4 + '4' = 44`,而`4 + (+'4') = 8` (2认同)