2012-08-07 57 views
4

我想知道下面的條件語法之間的核心區別是什麼?有條件的「if(x)」不同於「if(x == true)」嗎?

if (something) { 
    // do something 
} 

if (something == true) { 
    // do something 
} 

有什麼不同?

編輯:我很抱歉。當問題被問到時,我犯了一個錯字。我並不是想要把三重等號。我知道三重平等是一個嚴格的運營商。我的意思是詢問'=='是否等於if(something)。

+6

通過將'==='更改爲'==',您完全改變了問題的含義。編輯:現在有人把它改回來了@ @ W3Geek:你究竟打算做什麼? – 2012-08-07 19:35:04

+2

是的,我犯了一個錯字。我打算說雙等於。我知道三倍的平等是......它是一個嚴格的運營商。我已經知道他們之間有區別。 – W3Geek 2012-08-07 19:36:42

+0

就個人而言,如果我需要檢查一個已知的布爾值,並且if(a!== null && a!== undefined)來測試if(a),我寫if(a === true)。我認爲如果(a)可能意味着太多的東西......例如,如果a是0,那麼如果(a)將評估爲假... – frenchie 2012-08-07 19:38:35

回答

12

編輯:下面只適用於原始問題,其中使用===運算符。

第一個將執行該if語句的主體如果something是「truthy」,而如果它是在類型和值到true等於第二隻執行它。

那麼,什麼是「truthy」?要了解這一點,你需要知道它的相反之處:錯誤的。如果放置在條件表達式中,JavaScript中的所有值將被強制爲布爾值。下面是falsey值的列表:

  • false
  • 0(零)
  • ""(空字符串)
  • null
  • undefined
  • NaN

所有其他值都是真實的,儘管我可能錯過了某些人會在評論中指出的一些不起眼的角落案例。

這裏是我的答案更新的問題:

有條件if (something)if (something == true)是等價的,但第二個是多餘的。在這兩種情況下,something都將以相同的方式被強制類型化。這是錯誤的。見Felix Kling's answer

+0

+1爲'truthy' – andrewsi 2012-08-07 19:34:08

+0

+1爲'truthy'。我的意思是'=='。它是否等同於if(something)? – W3Geek 2012-08-07 19:34:29

+4

不幸的是,這不再是完全正確的,現在OP已經指定他的意思是'=='而不是'==='。 – apsillers 2012-08-07 19:38:04

2

現在問題已從===更改爲==,否,沒有實際區別。

3

if(something)相當於if(someting == true)

==運算符檢查相等性,而===檢查相同性。在這種情況下,任何真值都會導致第一個條件滿足,但只有true將導致第二個條件滿足。

編輯:費利克斯·克林的答案是正確的。請參考。

+0

+1這回答了「真正的意圖問題」簡潔。 – 2012-08-07 19:40:58

+0

+1用於回答既定問題*和*原始問題。 – Matt 2012-08-07 19:42:23

+3

他們不相同!看到我的答案:http://stackoverflow.com/a/11852927/218196 – 2012-08-07 19:53:23

1

有幾種方法可以查看它。第一個例子評估是否「某事」具有真實或正面的價值。所以只要它不是0,負數,空值或空值,它就應該評估if語句的內容。

在第二個語句中,您正在測試以查看「某事」是否與布爾值true相等。另一個詞是「TRUE」或1.​​您也可以進行「===」比較,以便與您的比較結果相同。所以在這種情況下,如果你做了一些=== true,那麼「something」必須是布爾值true,1的值是不夠的。

12

區別在於if(something),something is evaluated as boolean。它基本上是

if(ToBoolean(something)) 

其中ToBoolean是調用參數轉換爲布爾值的內部函數。您可以使用雙negation!!something來模擬ToBoolean

在第二種情況下,both operands are (eventually) converted to numbers first,所以你最終

if(ToNumber(something) == ToNumber(true)) 

這可能導致非常不同的結果。再次,ToNumber是一個內部函數。可以使用unary plus operator+something == +true來模擬(某種程度上)。在實際算法中,如果something是一個對象,則something首先通過ToPrimitive


假設

var something = '0'; // or any other number (not 0)/numeric string != 1 

if(something)將是true,因爲'0'是一個非空字符串。

if(something == true)false,因爲ToNumber('0')0ToNumber(true)10 == 1false

+1

+1這是最接近正確答案的東西。我唯一要補充的是'ToBoolean'和'ToNumber'不直接作爲JavaScript中的函數公開。雖然將'Number'構造函數作爲函數調用,或者使用一元'+'運算符是等同的。 – 2012-08-07 19:54:44

+0

@Matthew:謝謝,我澄清了它。 – 2012-08-07 19:58:28

+0

雅每天學點新東西! – FishBasketGordo 2012-08-07 20:03:40

0

thing == truething這兩個條件沒有區別。

然而,thing === truething之間有很大差異。

在JavaScript中,值被強制爲一個布爾值時,他們被置於一個條件。這意味着所有類型的所有值必須能夠被強制爲truefalse。強制爲true的值通常稱爲「truthy」,強制爲false的值稱爲「falsey」。

的 「falsey」 的值如下:

  • NaN(非數字)
  • ''(空字符串)
  • undefined
  • null
  • 0(數字0)

當被脅迫時,其他方面的評估結果爲trueThis jsFiddle將幫助你跟蹤什麼是「真理」和什麼是「假的」。

身份運算符(===)不執行任何類型的強制:如果類型不同,比較立即失敗。