从谷歌浏览器控制台:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
从谷歌浏览器控制台:
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。 )
呼叫号码(结果(1))。
呼叫号码(结果(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 == 0
是真的但是null == 0
假的。
对于false == 0
,Type(x) 是布尔值。这意味着应用了 Step 18 的类型转换,并将 false 转换为数字。ToNumber(false) 为 0,0 == 0
为真,所以比较成功。
对于null == 0
,Type(x) 为 Null。没有任何类型检查匹配,因此比较进入第 22 步,该步骤返回 false。比较失败。
null 作为数字转换为 0:(+null)
为 0。 > 和 < 将 null 转换为该值,因此与数字相比,它充当零。==
不会将 null 转换为数字,因此null == 0
为 false。