59

从谷歌浏览器控制台:

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

2 回答 2

86

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

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

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

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

§9.1 类型转换和测试

表 14 - 编号转换

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

知道何时应用 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 不同,它使用 and 而不是 or。 )

  4. 呼叫号码(结果(1))。

  5. 呼叫号码(结果(2))。

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

§11.9.3 抽象等式比较算法

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

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) 是 Boolean,则返回比较结果 ToNumber(x) == y。

19. 如果 Type(y) 为 Boolean,则返回比较结果 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) 是布尔值。这意味着应用了 Step 18 的类型转换,并将 false 转换为数字。ToNumber(false) 为 0,0 == 0为真,所以比较成功。

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

于 2012-11-15T22:45:58.857 回答
13

null 作为数字转换为 0:(+null)为 0。 > 和 < 将 null 转换为该值,因此与数字相比,它充当零。==不会将 null 转换为数字,因此null == 0为 false。

于 2012-11-15T22:46:51.007 回答