2011-07-10 51 views
4

我是JavaScript新手,我試圖從Internet資源中學習它。雖然我意識到會有大量的cr * p材料,但大多數人似乎同意的一件事是JS中事物的真實性(僅舉例說明hereJavaScript中的布爾值與數字比較的真實性

現在我發現了這個奇怪的東西實驗:

(true == 2)false。爲什麼?

據我所知,2是一個非零的號碼,所以它應該被評估爲true

回答

8

這是因爲當一個等價算的操作數是在幾乎所有的情況下的數,則另一個操作數轉換成數字,然後結果進行比較。所以你最後要比較12,而不是truetrue。該規則的唯一例外是null,undefined默認值(參見下面的論題)的對象是nullundefined;比較一個數字與那些返回false(即使Number(null)0;不要問)。

細節在the specification,第11.9.3:「摘要相等比較算法」HTML version):

比較 X == ÿ,其中 Xÿ 是值,產生truefalse。這樣的比較 如下進行:

  1. 如果Type( X)是相同的類型(Ý),然後

    1. 如果Type( X)是未定義,返回true

    2. 如果類型( x)爲空,則返回爲真

    3. 如果Type( X)是號碼,然後

      1. 如果 XNaN的,返回

      2. 如果ŸNaN的,返回

      3. 如果 X是相同數量的值Ÿ,返回真正

      4. 如果 X+ 0ÿ-0,返回真正

      5. 如果 X-0ÿ+ 0,返回真正

      6. 返回false

    4. 如果Type( X)是字符串,則返回如果 Xÿ是完全相同的字符(相同的長度 和相同的字符在對應的位置)相同的序列。否則,返回 false

    5. 如果Type( X)是布爾型,返回如果 Xÿ或兩者。 否則,返回false

    6. 返回如果 Xÿ指代相同的對象。 否則,返回false

  2. 如果 Xÿ不確定,返回真正

  3. 如果 X不確定ÿ,返回真正

  4. 如果Type( X)是數目和類型(Ý)是字符串,返回
    的 比較的結果 X == ToNumber(ý)。

  5. 如果Type( X)是字符串和類型(Ý)是數字,返回
    比較ToNumber( X)== ÿ的結果。

  6. 如果Type( X)是布爾型,返回的比較 ToNumber( X)== ÿ的結果。

  7. 如果Type(Ý)是布爾值,返回比較的結果 X == ToNumber(ý)。

  8. 如果Type( X)或者是字符串或數目和類型(Ý)是 對象,
    返回的比較 X == ToPrimitive(ÿ)的結果。

  9. 如果Type( X)是Object和類型(Ý)或者是字符串或 號,
    返回的比較ToPrimitive( X) == ÿ的結果。

  10. 返回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如果將其轉換爲數字;但構造函數可以通過valueOftoString重寫該行爲。主機對象的缺省值是到主機環境。)

2

布爾true恆定被提升爲數量,即作爲1

1

對於非嚴格比較(==)如果操作數是相同類型的不,它們將被鑄造/強制和嚴格比較,如果操作數是數字或布爾值(MDN),則優先選擇數字。

因此true == 2評估爲Number(true) === 2這是1 === 2,這是錯誤的。

當然你也可以強制的事情進行比較,只要你想他們,這是明確的,可以解決以後難以發現問題作者:

true === Boolean(2)是真實的。