2010-09-27 87 views
22

全國各地的許多第三方庫和最佳實踐的博客/建議,等等...這是經常可以看到的語法是這樣的:在Javascript中使用===而不是== typeof的原因是什麼?

typeof x === 'object' (instead of typeof x == 'object') 
typeof y === 'string' (instead of typeof x == 'string') 
typeof z === 'function' (instead of typeof x == 'function') 

如果typeof操作已經返回一個字符串,什麼是對類型檢查的必要性返回值呢?如果typeof運算(typeof運算(X))總是,無論什麼實際X是,那麼==應該是足夠的和===不必要的。

在什麼情況下會輸入而不是返回字符串?即使存在一些附帶案例,爲什麼附加類型檢查用於對象,字符串,函數等...

+7

沒有任何情況。大多數人只是因爲某種原因而死於類型轉換(* cough * Crockford) – MooGoo 2010-09-27 13:02:07

+3

@MooGoo當JavaScript中的類型轉換規則如此隨意時,不信任它可能是件好事。 – Skilldrick 2010-09-27 13:07:21

+0

在這種情況下真的是類型鑄造? typeof運算符是內置的,而不是用戶定義的。那麼,真正的風險是什麼? – 2010-09-27 13:09:01

回答

19

要回答主要問題 - 使用typeof==沒有任何危險。以下是您爲什麼想要使用===的原因。


從克羅克福德的建議是,它的安全在許多情況下使用===,而如果你打算在某些情況下使用它,最好是一致的,並用它的一切。

這個想法是,你可以考慮每次檢查平等時是否使用=====,或者你可以養成總是寫作===的習慣。

有幾乎沒有使用過==一個===原因 - 如果你比較truefalse,你想強迫(比如你要0'',以評估false)就用if(! empty_str)而非if(empty_str == false)


對於那些誰不明白==之外的typeof的背景下存在的問題,看到這一點,從The Good Parts

'' == '0'   // false 
0 == ''   // true 
0 == '0'   // true 

false == 'false' // false 
false == '0'  // true 

false == undefined // false 
false == null  // false 
null == undefined // true 

' \t\r\n ' == 0 // true 
+2

不,這不是我問的問題:我特別要求使用typeof運算符。 – 2010-09-27 13:07:10

+0

不應該是'if(empty_str === false)';) – 2010-09-27 13:07:12

+3

@Eric我知道,但我所說的是使用'==='的原因是爲了與您的其他代碼保持一致。 – Skilldrick 2010-09-27 13:08:51

5

如果typeof運算符已經返回 一個字符串,有什麼需要輸入 檢查返回值?如果 typeof(typeof(x))始終是字符串,則沒有 與x實際是什麼關係,那麼== 應該足夠,並且不需要=== 。

這是主觀的。您可以輕鬆地將其轉換,然後詢問:「當您不期望隱式轉換時,爲什麼要使用==?」兩者在這裏都能很好地工作,所以用你覺得更好的表達你的意圖。嘗試在項目中保持一致。

+1

謝謝。似乎是迄今爲止的共識 - 風格超過需求。 – 2010-09-27 13:19:29

0

三等分運算符主要用於變量類型和值檢查(all in 1表達式),也稱爲沒有類型強制的等於

實施例:

var a = 1; 
var b = 1; 
var c = "1"; 
var d = "1"; 

alert (a === b); //True, same value and same type (numeric) 
alert(c === d); //True, same value and same type (string) 
alert(b === c); //False, different type but same value of 1 

參見道格克羅克福德上的類型強制的YUI Theater


如果typeof運算符已經返回 一個字符串,什麼是輸入 檢查返回值,以及需要?如果 typeof(typeof(x))始終是字符串,則沒有 與x實際是什麼關係,那麼== 應該足夠,並且不需要=== 。

不使用typeof而是使用===運算符的最有效的原因是用於瀏覽器之間的類型強制(解釋)。有些瀏覽器可以通過6=="6"爲真,有些瀏覽器不會(取決於JS解釋器的嚴格性),所以通過引入類型強制來澄清這一點。 另外,由於JavasScript的變量不是基於類型的變量(即,變量類型不像在Java中那樣在編譯時聲明),所以它會帶來「面向對象」方法。

E.g.在Java中,這將失敗:

if ("6" instanceof Number) { // false 

希望我回答了您的問題。

+0

再次 - 不是我問。 – 2010-09-27 13:12:22

+0

糟糕...抱歉,從未完全讀過您的問題......正在更新.... – 2010-09-27 13:15:04

+0

不,我在涉及使用typeof運算符的情況下特別提出要求。 typeof 6應該總是返回字符串字符串「number」,因此檢查「typeof 6」的類型不應該是必需的。 – 2010-09-27 13:29:26

2

在這種情況下,沒有任何理由支持===而不是==,因爲兩個操作數都保證是字符串,因此兩個操作符都會給出相同的結果。由於==少了一個字符,我會贊成這一點。

克羅克福德對此的建議是始終使用===,這對於初學者來說是合理的建議,但如果你知道這些問題(在其他答案中已經涵蓋),這是毫無意義的偏執。

+0

謝謝。似乎是迄今爲止的共識 - 風格超過需求。 – 2010-09-27 13:30:07

1

因爲===比==快,因爲省略了類型強制。 當然,它可能是一個可以忽略的差異,但它仍然存在。

+4

這不一定是正確的:如果您查看每個運算符在ECMAScript規範中需要採取的步驟,那麼在比較兩個相同類型的對象(如兩個字符串)的情況下,它們實際上是相同的。嘗試基準化它。 – 2010-09-28 08:58:07

相關問題