我想知道下面的條件語法之間的核心區別是什麼?有條件的「if(x)」不同於「if(x == true)」嗎?
if (something) {
// do something
}
與
if (something == true) {
// do something
}
有什麼不同?
編輯:我很抱歉。當問題被問到時,我犯了一個錯字。我並不是想要把三重等號。我知道三重平等是一個嚴格的運營商。我的意思是詢問'=='是否等於if(something)。
我想知道下面的條件語法之間的核心區別是什麼?有條件的「if(x)」不同於「if(x == true)」嗎?
if (something) {
// do something
}
與
if (something == true) {
// do something
}
有什麼不同?
編輯:我很抱歉。當問題被問到時,我犯了一個錯字。我並不是想要把三重等號。我知道三重平等是一個嚴格的運營商。我的意思是詢問'=='是否等於if(something)。
編輯:下面只適用於原始問題,其中使用===
運算符。
第一個將執行該if語句的主體如果something
是「truthy」,而如果它是在類型和值到true
等於第二隻執行它。
那麼,什麼是「truthy」?要了解這一點,你需要知道它的相反之處:錯誤的。如果放置在條件表達式中,JavaScript中的所有值將被強制爲布爾值。下面是falsey值的列表:
false
0
(零)""
(空字符串)null
undefined
NaN
所有其他值都是真實的,儘管我可能錯過了某些人會在評論中指出的一些不起眼的角落案例。
這裏是我的答案更新的問題:
有條件這是錯誤的。見Felix Kling's answer。if (something)
和if (something == true)
是等價的,但第二個是多餘的。在這兩種情況下,something
都將以相同的方式被強制類型化。
現在問題已從===
更改爲==
,否,沒有實際區別。
if(something)
相當於if(someting == true)
。
==
運算符檢查相等性,而===
檢查相同性。在這種情況下,任何真值都會導致第一個條件滿足,但只有true
將導致第二個條件滿足。
編輯:費利克斯·克林的答案是正確的。請參考。
+1這回答了「真正的意圖問題」簡潔。 – 2012-08-07 19:40:58
+1用於回答既定問題*和*原始問題。 – Matt 2012-08-07 19:42:23
他們不相同!看到我的答案:http://stackoverflow.com/a/11852927/218196 – 2012-08-07 19:53:23
有幾種方法可以查看它。第一個例子評估是否「某事」具有真實或正面的價值。所以只要它不是0,負數,空值或空值,它就應該評估if語句的內容。
在第二個語句中,您正在測試以查看「某事」是否與布爾值true相等。另一個詞是「TRUE」或1.您也可以進行「===」比較,以便與您的比較結果相同。所以在這種情況下,如果你做了一些=== true,那麼「something」必須是布爾值true,1的值是不夠的。
區別在於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')
是0
,ToNumber(true)
是1
和0 == 1
是false
。
+1這是最接近正確答案的東西。我唯一要補充的是'ToBoolean'和'ToNumber'不直接作爲JavaScript中的函數公開。雖然將'Number'構造函數作爲函數調用,或者使用一元'+'運算符是等同的。 – 2012-08-07 19:54:44
@Matthew:謝謝,我澄清了它。 – 2012-08-07 19:58:28
雅每天學點新東西! – FishBasketGordo 2012-08-07 20:03:40
thing == true
和thing
這兩個條件沒有區別。
然而,thing === true
與thing
之間有很大差異。
在JavaScript中,值被強制爲一個布爾值時,他們被置於一個條件。這意味着所有類型的所有值必須能夠被強制爲true
或false
。強制爲true
的值通常稱爲「truthy」,強制爲false
的值稱爲「falsey」。
的 「falsey」 的值如下:
NaN
(非數字)''
(空字符串)undefined
null
0
(數字0)當被脅迫時,其他方面的評估結果爲true
。 This jsFiddle將幫助你跟蹤什麼是「真理」和什麼是「假的」。
身份運算符(===
)不執行任何類型的強制:如果類型不同,比較立即失敗。
通過將'==='更改爲'==',您完全改變了問題的含義。編輯:現在有人把它改回來了@ @ W3Geek:你究竟打算做什麼? – 2012-08-07 19:35:04
是的,我犯了一個錯字。我打算說雙等於。我知道三倍的平等是......它是一個嚴格的運營商。我已經知道他們之間有區別。 – W3Geek 2012-08-07 19:36:42
就個人而言,如果我需要檢查一個已知的布爾值,並且if(a!== null && a!== undefined)來測試if(a),我寫if(a === true)。我認爲如果(a)可能意味着太多的東西......例如,如果a是0,那麼如果(a)將評估爲假... – frenchie 2012-08-07 19:38:35