从 Google Chrome 控制台:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
从 Google Chrome 控制台:
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,结果变为真。
你可以迫使它通过将是数字+
,或通过使用数字运营商如在眼前<
,<=
,>
,和>=
。注意如何null >= 0
和null <= 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 是值)产生true、false或undefined(表示至少一个操作数是NaN)。这样的比较如下:
调用 ToPrimitive(x, 提示编号)。
调用 ToPrimitive(y, 提示号码)。
如果 Type(Result(1)) 为 String 且 Type(Result(2)) 为 String,则转到步骤 16。(注意,此步骤与步骤 7 的加法运算符 + 的算法不同,在于使用 and 代替 or。 )
调用 ToNumber(Result(1))。
调用 ToNumber(Result(2))。
该==
操作是不同的。下面描述了它的类型转换。请注意 null 和 false 如何遵循不同的规则。
§11.9.3 抽象相等比较算法
比较 x == y,其中 x 和 y 是值,产生true或 false。这样的比较如下:
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。