2015-02-17 53 views
0

我遇到了一些似乎在解釋器上不一致的東西,雖然我知道它可能是有道理的,我只是不明白它。它與評估真/假值和布爾值的平等有關。真理和謬誤價值的平等(JavaScript)

實施例1:

if (document.getElementById('header')) { 
//run code here 
} 

如果與「頭部」的ID的元素在文件中被發現,因爲對象的存在被認爲是truthy條件爲真。

實施例2:

if (document.getElementById('header) == true) { 
// run code here 
} 

預先假定所引用的元件在文獻中找到。有人向我解釋說,這個條件將被評估爲假,因爲真值不等於布爾值true。

這似乎沒有道理。由於類型強制,對象的存在被認爲是真實的,所以即使數據類型不同,它也應該等於真。

考慮以下幾點:

(false == 0) // evaluates to true 
(false === 0) // evaluates to false 

這是錯誤的等於當您使用等於0操作是真實的情況。因爲0被認爲是一個虛假值,所以它等於false的布爾值。值是相同的,並且數據類型是不同的。

對我來說,(document.getElementById('header')== true)和(false == 0)是一回事。然而,他們都評估了不同的東西。

有人可以向我解釋爲什麼會出現這種情況嗎?我一直在閱讀對此的不同描述,但似乎沒有人能夠深入解釋它。

+2

https://developer.mozilla.org/en-US/docs/Glossary/Truthy http://james.padolsey.com/javascript/truthy-falsey/ – 2015-02-17 21:32:12

+0

所以布爾(document.getElementById('header) )== true' – zerkms 2015-02-17 21:36:18

回答

1

document.getElementById('header')返回DOM對象或null。所以,在你的第二個比較(假設它解析爲對象),您比較:

if (obj == true) 

DOM對象不是==true

要明白爲什麼,您必須轉到ECMAScript規則進行自動類型轉換,您可以在ECMAScript 5規範中看到:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

enter image description here

比較的object == boolean當操作規則是下降到規則9和10

  • 如果Type(x)是對象一路並且Type(y)是String或Number,則返回ToPrimitive(x)== y的比較結果。

  • 返回false。

  • 第9條是第一條規則,其中Type(x)Object和兩種類型是不一樣的,所以它首先要檢查的一個。

    由於Type(y)Boolean,它不通過規則9.

    因此,當沒有通過任何規則1-9,它的計算結果爲false


    當你這樣做比較:

    (false == 0) // evaluates to true 
    

    你的類型轉換規則看着規則#6,將做到:

    ToNumber(false) == 0 
    

    將解析爲:

    0 == 0 
    

    這將是true


    對於這一個:

    (false === 0) 
    

    當你使用===,如果兩個類型是不同的,那麼結果是立即false所以這個計算結果爲false===要求類型AND值是相同的,所以如果類型不相同,那麼它甚至不會嘗試比較該值。 ===這是使用它的一個有用的理由。


    您應該明白truthyfalsey規則只適用於單一的檢查像這樣在比較沒有=====

    if (obj) 
    

    ,當你比較x == y他們不適用。爲此,您必須參考規範第11.9.3節中的類型轉換規則(以上鍊接)。

    +0

    爲您的問題中的其他幾個案例添加了解釋。這裏的關鍵是參考規範並準確瞭解書面規則是用於類型轉換的。 – jfriend00 2015-02-18 01:54:19

    +0

    超級有用,謝謝!如果我正確地理解了你,那麼這是一個表達式的最終結果,它將被視爲真實或虛假,並規定執行哪些條件語句。但是表達中價值觀的真諦和謬誤是無關緊要的,並且不會發揮作用。那是對的嗎? – Tom 2015-02-18 22:34:16

    +0

    @湯姆 - 不完全。當表達式的特定部分沒有'=='或'==='時,Truthy/falsey會發揮作用。如果你這樣做:'if(test1 && test2 && test3){...}',那麼每個單獨術語的真/假就決定了整個if語句的結果。但是,如果您有'if(test1 == true && test2 == true && test3 == true){...}',那麼上面的類型轉換規則決定了每個術語並導致整體結果。 – jfriend00 2015-02-19 00:22:51

    -1

    當if()語句執行時,它檢查圓括號內是否有真值。 ==運算符正在檢查兩個值的性質是否相等。在JavaScript中,true和false分別是==到1和0;因此爲什麼你可以鍵入(4 + true)並獲得5,或者false * 6並獲得0!

    當您鍵入something == true時,您確實在檢查是否something == 1。 如果某物不是布爾值,它將不會與1相同。

    也許您的假設的解釋「由於類型強制,對象的存在被認爲是真實的,因此它應該等於true。 「

    1. 如果任何truthy值等於真,
    2. 那麼任何truthy值等於任何truthy值(由傳遞特性,A = B,C = B,因此一個= C),
    3. 然而,這並不適用於所有情況! (「藍色」==「綠色」,5 ==「六」,因爲它們都是非假值,這會使==相當不值!)

    結論並沒有出現,所以該公設無效。一般來說,如果你需要檢查兩件事情是否真的是一回事,你應該使用===。

    希望這可以解決問題!

    +0

    呃,在Javascript中'true'和'false'不是'0'和'1'的別名。它們是不同類型的不同值。確實如此:'if(true === 1)'。它不匹配。 – jfriend00 2015-02-17 21:41:07

    +0

    是的,你是對的...別名不是我在這裏找的字;必須有另一種方式來描述它。 – 2015-02-17 21:48:43

    +0

    謝謝,這對我來說也是非常有幫助的! – Tom 2015-02-18 22:25:07

    0

    預先設定在文檔中找到引用的元素。有人向我解釋說,這個條件將被評估爲假,因爲真值不等於布爾值true。

    你說得對,它沒有任何意義,因爲任何人解釋說,你是錯誤

    DOM元素的存在將評估爲true,如果它不存在,則評估爲false(使用double-equals與triple)。如果他們使用三倍等於,您可以簡單地嘗試: !!document.getElementById('someNodeId')它將返回一個布爾值。

    如果您想確定,您可以隨時在控制檯中試用。

    !!document.getElementById('notify-container'); 
    >> true 
    !!document.getElementById('non-existing-node-goes-here'); 
    >> false 
    

    編輯:我沒有清楚地閱讀示例或示例已更新。是的,你使用雙等於。元素是真理,但它不是「真實的」。