2012-01-04 115 views
26

我用JavaScript編寫的一段非常簡單的代碼存在問題,請問您能幫我些忙嗎?未定義的變量,值== false與!值

這裏就是我想我已經明白到目前爲止關於JavaScript和變量:

  • 一個未定義的值進行評估,以虛假的布爾運算
  • 通過在比較 - 使用==操作符,你」重新詢問兩個數值是否具有可比性,無論他們的類型如何

我在網上課程中發現了一個練習文件,我嘗試這樣做,但是我沒有得到本課中預期的相同結果;主要的問題是我通過「if value == false {...}」來比較值,而解決方案使用「if!value {...}」

所以我決定寫一個非常短的代碼,以便自己嘗試,但我得到了不同的結果。在下面的例子中,我期望這個JS代碼生成兩個相同的警報(「foo等於false」),但是第一個if語句返回「foo不等於false」,而第二個if返回(如預期的那樣) 「foo等於假」。

這是我寫的東西:

var foo = undefined; 

if (foo == false) { 
    alert("foo is equal to false"); 
} else { 
    alert("foo is not equal to false"); // Javascript executes this row 
} 

if (!foo) { 
    alert("foo is equal to false"); // Javascript executes this row 
} else { 
    alert("foo is not equal to false"); 
} 

AFAIK的雙中頻應該做同樣的工作,逸岸當我試圖在第一線的值替換「變種富=不確定;」用「var foo = 0;」它按預期工作,0是另一個應該被評估爲假的值,或者至少這是我記得的。

你能告訴我我做錯了什麼嗎?

+4

那是因爲不等於'FALSE'。然而,undefined是falsey所以'undefined' - > true – Raynos 2012-01-04 17:07:44

+1

等於false和「falsey」之間的區別是什麼? – Cesco 2012-01-04 17:16:46

+2

如果相等然後'x ==虛假'如果虛假然後'!x == true' – Raynos 2012-01-04 17:17:16

回答

28

==算法Abstract Equality Comparison Algorithm不是你可以簡單地假設一個結果,除非你知道算法。你需要知道它是如何工作的細節。

例如,nullundefined是特例。除了認爲彼此相等之外,他們不做任何類型轉換。

否則,通常會有一種類型轉換嘗試將兩個操作數都減少爲一個通用類型。這通常會以轉換爲轉換。

這就是爲什麼:

  • null == undefined; // true

  • null == 0; // false

  • +null == '0' // true

所以,如果你知道算法如何工作,你知道undefined絕不等於除undefinednull以外的任何其他類型,但其他不完全相同的類型可能會被強制降爲相同的類型。

這樣做if(!x) vs if(x==false)是完全不同的測試。

  • if(!x)執行toBoolean轉換。

  • if(x == false)使用複雜的算法來決定正確的轉換。

所以......

if(x == false) 

...如果xundefined,它被確定爲不等於false,但如果x0甚至"0",將被視爲等於false

  • 0 == false; // true

  • "0" == false; // true

+1

非常感謝你,現在我開始明白我的錯誤 – Cesco 2012-01-04 17:55:43

+1

是否有任何地方找到它的複雜算法是什麼,或者它是如何工作的細節?你能解釋一下嗎? – mrReiha 2015-06-16 08:17:38

+2

@mrReiha:這些都在ECMAScript語言規範中詳細說明。這裏有一個鏈接到[抽象平等比較算法](https://es5.github.io/#x11.9.3) – 2015-06-16 11:34:49

4

真相與等價與true是在JavaScript兩回事。

if (...)執行的第一條語句,如果...是「truthy」,而不是當他們是「平等」到任何其他特定值,那麼你的第二個條件應該像

if (!foo) { 
    alert("foo is falsy"); // Javascript executes this row 
} else { 
    alert("foo is truthy"); 
} 

有相當JavaScript中的幾個「falsy」值:NaN,"",0,-0,false,nullundefined。所有其他值是truthy

!運算符返回false任何truthy值和true任何falsy值,所以!x相同(x ? false : true)所有x

+0

非常感謝你 – Cesco 2012-01-04 17:56:21

3

一般來說我發現積極的結果更易於解析,彷彿if(!foo)是雙負,所以我傾向於把它周圍:

if (foo) { 
    alert("foo is something or boolean true"); 
} else { 
    alert("foo is null, undefined or boolean false"); 
} 

特別是兩個undefinednull不是真或假,但JavaScript可以處理一種簡寫,因爲它是動態的。

真的在上面的語句是一樣的東西:

if (foo != null && (foo.constructor !== Boolean || foo == true)) { 
    alert("foo is something or boolean true"); 
} else { 
    alert("foo is null, undefined or boolean false"); 
} 

你第一次的變量定義,然後檢查,如果是布爾值,它是真實的。

同時您的虛假陳述被檢查不同的東西:

if (foo == false) { 
    alert("foo is populated with the boolean false"); 
} else { 
    alert("foo is true, something else or null"); 
} 
+0

謝謝你的澄清 – Cesco 2012-01-04 17:52:04

+1

'「foo爲空,未定義或布爾值false」 '或+/- 0或NaN或空字符串。 – 2012-01-04 18:30:13