[英]Why is null in JavaScript bigger than -1, less than 1, but not equal (==) to 0? What is it exactly then?
從谷歌瀏覽器控制台:
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,結果為true。
您可以通過將+
放在前面或使用數字運算符(如<
, <=
, >
和>=
強制它為數字。 注意null >= 0
和null <= 0
都是如此。
> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true
ECMAScript語言規范定義何時執行所謂的“ToNumber”轉換。 如果是,則null和false都轉換為0。
§9.1類型轉換和測試 :
表14 - 至數字轉換
\n 參數類型結果\n ------------- ------\n 未定義的返回NaN\n 空 回報+0\n Boolean如果argument為true,則返回1。 如果參數為假,則返回+0。\n Number返回參數(無轉換)。\n 字符串請參閱下面的語法和注釋。\n
知道何時應用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
為true但null == 0
為false。
對於false == 0
,Type(x)是布爾值。 這意味着應用了步驟18的類型轉換,並將false轉換為數字。 ToNumber(false)為0,0 0 == 0
為真,因此比較成功。
對於null == 0
,Type(x)為Null。 沒有類型檢查匹配,因此比較將進入步驟22,返回false。 比較失敗。
null將數字轉換為0作為數字: (+null)
為0.>並且<cast null為此值,因此與數字進行比較時,它將作為零。 ==
不會將null轉換為數字,因此null == 0
為false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.