我是JavaScript新手,我試圖從Internet資源中學習它。雖然我意識到會有大量的cr * p材料,但大多數人似乎同意的一件事是JS中事物的真實性(僅舉例說明here)JavaScript中的布爾值與數字比較的真實性
現在我發現了這個奇怪的東西實驗:
(true == 2)
是false
。爲什麼?
據我所知,2
是一個非零的號碼,所以它應該被評估爲true
。
我是JavaScript新手,我試圖從Internet資源中學習它。雖然我意識到會有大量的cr * p材料,但大多數人似乎同意的一件事是JS中事物的真實性(僅舉例說明here)JavaScript中的布爾值與數字比較的真實性
現在我發現了這個奇怪的東西實驗:
(true == 2)
是false
。爲什麼?
據我所知,2
是一個非零的號碼,所以它應該被評估爲true
。
這是因爲當一個等價算的操作數是在幾乎所有的情況下的數,則另一個操作數轉換成數字,然後結果進行比較。所以你最後要比較1
與2
,而不是true
與true
。該規則的唯一例外是null
,undefined
和默認值(參見下面的論題)的對象是null
或undefined
;比較一個數字與那些返回false
(即使Number(null)
是0
;不要問)。
細節在the specification,第11.9.3:「摘要相等比較算法」(HTML version):
比較 X == ÿ,其中 X和ÿ 是值,產生true或false。這樣的比較 如下進行:
如果Type( X)是相同的類型(Ý),然後
如果Type( X)是未定義,返回true。
如果類型( x)爲空,則返回爲真。
如果Type( X)是號碼,然後
如果 X是NaN的,返回假。
如果Ÿ是NaN的,返回假。
如果 X是相同數量的值Ÿ,返回真正。
如果 X是+ 0和ÿ是-0,返回真正。
如果 X是-0和ÿ是+ 0,返回真正。
返回false。
如果Type( X)是字符串,則返回真如果 X和 ÿ是完全相同的字符(相同的長度 和相同的字符在對應的位置)相同的序列。否則,返回 false。
如果Type( X)是布爾型,返回真如果 X和 ÿ都真或兩者假。 否則,返回false。
返回真如果 X和ÿ指代相同的對象。 否則,返回false。
如果 X是空和ÿ是不確定,返回真正。
如果 X是不確定和ÿ是空,返回真正。
如果Type( X)是數目和類型(Ý)是字符串,返回
的 比較的結果 X == ToNumber(ý)。如果Type( X)是字符串和類型(Ý)是數字,返回
比較ToNumber( X)== ÿ的結果。如果Type( X)是布爾型,返回的比較 ToNumber( X)== ÿ的結果。
如果Type(Ý)是布爾值,返回比較的結果 X == ToNumber(ý)。
如果Type( X)或者是字符串或數目和類型(Ý)是 對象,
返回的比較 X == ToPrimitive(ÿ)的結果。如果Type( X)是Object和類型(Ý)或者是字符串或 號,
返回的比較ToPrimitive( X) == ÿ的結果。返回false。
如果您想檢查,他們都是truthy或兩者falsey,您可以使用感嘆號(!
)或雙響(!!
)成語來他們都強迫到布爾:
var a = true,
b = 2;
alert(a == b); // "false", 1 !== 2
alert(!!a == !!b); // "true", true === true
alert(!a == !b); // "true", false === false
a = false;
b = 0;
alert(a == b); // "true", 0 === 0
alert(!!a == !!b); // "true", false === false
alert(!a == !b); // "true", true === true
...但通常使用==
或!=
與布爾值是不理想的。但它確實出現了。
我傾向於使用雙重爆炸,但在JavaScript中沒有理由超過爆炸。 (在其他一些語言中有一個關於單重的爭論,儘管它與if (!!x)
的一致性很弱。在JavaScript中,你永遠不需要在if (x)
情況下的雙重結果,所以......)
(題外話:大多數JavaScript對象的默認值是一個字符串,儘管經常被人喜歡「的翻譯:」這最終被NaN
如果將其轉換爲數字;但構造函數可以通過valueOf
和toString
重寫該行爲。主機對象的缺省值是到主機環境。)
布爾true
恆定被提升爲數量,即作爲1
對於非嚴格比較(==
)如果操作數是相同類型的不,它們將被鑄造/強制和嚴格比較,如果操作數是數字或布爾值(MDN),則優先選擇數字。
因此true == 2
評估爲Number(true) === 2
這是1 === 2
,這是錯誤的。
當然你也可以強制的事情進行比較,只要你想他們,這是明確的,可以解決以後難以發現問題作者:
true === Boolean(2)
是真實的。