簡體   English   中英

為什么JavaScript中的null大於-1,小於1,但不等於(==)0? 那究竟是什么?

[英]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 >= 0null <= 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是值,產生truefalseundefined (表示至少一個操作數是NaN )。 這樣的比較如下進行:

  1. 調用ToPrimitive(x,提示編號)。

  2. 調用ToPrimitive(y,提示編號)。

  3. 如果Type(Result(1))是String並且Type(Result(2))是String,請轉到步驟16.(請注意,此步驟與添加運算符+的算法中的步驟7的不同之處在於使用而不是或。 )

  4. 調用ToNumber(結果(1))。

  5. 調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM