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

IT技术 javascript
2021-01-28 10:02:27

从 Google Chrome 控制台:

var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
2个回答

当您将 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. 调用 ToNumber(Result(1))。

  5. 调用 ToNumber(Result(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

如果你仔细阅读,你就会明白为什么false == 0是真的,但为什么null == 0是假的。

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

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

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

是的 - + 可用于快速将事物转换为数字:这(+new Date())是获得毫秒时间的常用技巧。例如4 + '4' = 44,虽然4 + (+'4') = 8
2021-04-07 10:02:27