从谷歌Chrome控制台:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
答案 0 :(得分:64)
将null的相等性与0进行比较时,结果为false。如果强制null
在数字上下文中解释,则将其视为0,结果为真。
您可以将+
置于前面,或使用<
,<=
,>
和>=
等数字运算符强制将其设为数字。请注意null >= 0
和null <= 0
都是如此。
> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true
ECMAScript Language Specification定义何时执行所谓的“ToNumber”转换。如果是,则null和false都转换为0。
§9.1 Type Conversion and Testing
表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 The Abstract Relational Comparison Algorithm
比较
x < y
,其中x和y是值,会产生 true , false , 或未定义(表示至少有一个操作数 NaN )。这样 比较如下:
调用ToPrimitive(x,提示编号)。
调用ToPrimitive(y,提示编号)。
如果Type(Result(1))为String且Type(Result(2))为String,请转到步骤16.(请注意,此步骤与算法中的步骤7不同 添加运算符+使用而不是或。)
致电ToNumber(结果(1))。
- 醇>
致电ToNumber(结果(2))。
==
运算符不同。其类型转换如下所述。注意null和false如何遵循不同的规则。
§11.9.3 The Abstract Equality Comparison Algorithm
比较x == y,其中x和y是值,产生 true 或 的假即可。这样的比较如下进行:
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)是布尔值,则返回比较结果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 。
如果您仔细阅读,可以看到为什么false == 0
为真,但null == 0
为假。
对于false == 0
,Type(x)是布尔值。这意味着应用了步骤18的类型转换,并将false转换为数字。 ToNumber(false)为0,0 == 0
为真,因此比较成功。
对于null == 0
,类型(x)为空。没有类型检查匹配,因此比较将进入步骤22,返回false。比较失败。
答案 1 :(得分:11)
null将数字转换为0作为数字:(+null)
为0。和&lt;将null转换为此值,因此与数字进行比较时,它将作为零。 ==
不会将null转换为数字,因此null == 0
为false。