簡體   English   中英

為什么“undefined equals false”返回 false?

[英]Why does "undefined equals false" return false?

當我將 undefined 和 null 與 Boolean false 進行比較時,語句返回 false:

undefined == false;
null == false;

它返回錯誤。 為什么?

由於原始答案指向要刪除的規范,我想在此處提供鏈接和簡短的摘錄。

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

ECMA規范文檔列出了undefined == false返回false的原因。 雖然它沒有直接說明為什么會這樣,但回答這個問題最重要的部分在於這句話:

The comparison x == y, where x and y are values, produces true or false.

如果我們查找null的定義,我們會發現如下:

NULL or nil means "no value" or "not applicable".

在Javascript中, undefined以相同的方式處理。 它沒有任何價值。 但是,false確實有價值。 它告訴我們事情並非如此。 undefinednull不應該給我們任何價值。 同樣,它沒有什么可以轉換為它的抽象相等比較,因此結果總是錯誤的。 這也是null == undefined返回true的原因(它們都沒有任何值)。 應該注意的是, null === undefined因為它們的類型不同而返回false。 (在控制台中使用typeof(null)typeof(undefined)來檢查它)

但我很好奇的是,將NaN與任何東西進行比較總是會返回錯誤。 即使將它與自身進行比較。 [ NaN == NaN返回false]

另外,另一個奇怪的信息:[ typeof NaN返回“數字”]


嚴格平等

如果可能,您應該避免使用==運算符來比較兩個值。 而是使用===來真正看出兩個值是否彼此相等。 ==給出一種錯覺,即當兩個值可能不是通過使用強制時,它們確實完全相同。 例子:

5 == "5"是真的

5 === "5"是假的

"" == false是真的

"" === false是假的

0 == false為真

0 === false為false

這是因為它是如此。 :)

閱讀ECMA標准: https//www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

所以undefined真的意味着未定義。 不是假,不是真,不是0,不是空字符串。 因此,當您將undefined與任何內容進行比較時,結果始終為false,它等於該值。

來自無與倫比的MDN,由JavaScript的創建者公司贊助。

JavaScript提供三種不同的值比較操作:

  • 嚴格平等(或“三等於”或“身份”)使用===,
  • 松散的平等(“雙等於”)使用==,
  • 和Object.is(ECMAScript> 6中的新內容)。

選擇使用哪種操作取決於您要執行的比較類型。

簡而言之,double equals在比較兩件事時會執行類型轉換; 如果沒有類型轉換,三等於將進行相同的比較(如果類型不同,則總是返回false); 和Object.is的行為方式與triple equals相同,但是對NaN和-0以及+0進行特殊處理,以便最后兩個不相同,而Object.is(NaN,NaN)將為true 。 (通常將NaN與NaN進行比較 - 即,使用double equals或triple equals-評估為false,因為IEEE 754這樣說。)請注意,這些之間的區別都與它們對原語的處理有關; 沒有人比較參數在結構上是否在概念上相似。 對於具有相同結構但本身是不同對象的任何非原始對象x和y,所有上述形式將評估為false。

有關JavaScript中相等性的全貌的直觀概述: https//dorey.github.io/JavaScript-Equality-Table/

事實是,當你理解它是如何工作的時候,JavaScript的這個看似“壞”的方面是一種力量源泉。

Undefined不能= false,因為它尚未定義,因此不知道它是否存在

用英語說Anonymous = Fred或Anonymous!= Fred。

可能是弗雷德,可能是比爾,但目前我們還沒有線索。

Null的類似規則。 首先讓你的頭部變得有點痛苦,但這是一個非常有價值的規則,如果沒有它,各種各樣的模糊可能會蔓延到你的設計中。

例如,如何區分尚未輸入(空)或空白的內容之間的區別。

根據上面提到的規范:

如果Type(y)是布爾值,則返回比較結果x == ToNumber(y)。

Number(undefined) = NaN;

false == NaN // false

此外,如果我們改變命令false == undefined

如果Type(x)是布爾值,則返回比較結果ToNumber(x)== y。

Number(false) = 0;
0 == undefined

這種情況沒有規則,因此請使用默認行為:

返回false。

你的問題是一半,因為我們將undefined / null與任何其他類型進行比較。 我們會有錯誤的回報。 即使我們使用==運算符,也沒有強制發生。

未定義與false不同, false是布爾對象(其值為0因此確實定義了)。

一個例子:

var my_var;
var defined = (my_var === undefined)
alert(defined);  //prints true.  It is true that my_var is undefined

my_var = 22;
defined = (my_var === undefined)
alert(defined);  //prints false.  my_var is now defined

defined = (false === undefined)
alert(defined);  //prints false, false is defined

defined = (true === undefined)
alert(defined);  //prints false, true is defined

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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