来自Google Chrome控制台:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
Run Code Online (Sandbox Code Playgroud)
Joh*_*ica 68
将null的相等性与0进行比较时,结果为false.如果强制null在数字上下文中进行解释,则将其视为0,结果为true.
你可以迫使它通过将是数字+在前面,或通过使用数字运算符,例如<,<=,>,和>=.注意如何null >= 0并且null <= 0都是真的.
> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true
Run Code Online (Sandbox Code Playgroud)
的ECMAScript的语言规范当执行所谓的"ToNumber"的转换定义.如果是,则null和false都转换为0.
§9.1类型转换和测试:
表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抽象关系比较算法:
比较
x < y,其中x和y是值,产生true,false或undefined(表示至少一个操作数是NaN).这样的比较如下进行:
调用ToPrimitive(x,提示编号).
调用ToPrimitive(y,提示编号).
如果Type(Result(1))是String并且Type(Result(2))是String,请转到步骤16.(请注意,此步骤与添加运算符+的算法中的步骤7的不同之处在于使用而不是或. )
调用ToNumber(结果(1)).
调用ToNumber(结果(2)).
该==操作是不同的.其类型转换如下所述.注意null和false如何遵循不同的规则.
§11.9.3抽象等式比较算法
比较x == y,其中x和y是值,产生真或 假.这样的比较如下进行:
1.如果类型(x)与类型(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 == 0是真的,但却null == 0是错误的.
对于false == 0,Type(x)是布尔值.这意味着应用了步骤18的类型转换,并将false转换为数字.ToNumber(false)为0,0 == 0为true,因此比较成功.
对于null == 0,Type(x)为Null.没有类型检查匹配,因此比较将进入步骤22,返回false.比较失败.
tmc*_*mcw 12
null将数字转换为0作为数字:(+null)是0.>并且<cast null为此值,因此与数字进行比较时,它将作为零.==不会将null转换为数字,因此null == 0为false.