2016-09-20 35 views
3

使用類型強制(==而不是===)檢查undefined/null是否可以接受?檢查undefined/null時可以使用類型強制嗎?

有什麼缺點?有沒有更好的方法來檢查undefined/null?

說明:我正在尋找一個將檢查undefined和null的語句。

test(null); 
test(undefined); 

function test(myVar) { 
    if (myVar != undefined) { 
     alert('never gets called') 
    } 
} 
+0

你想檢查兩個,或只是一個? – baranskistad

+0

我想檢查兩個 – user2954463

+1

這是好的主觀和壞主觀之間的邊界。我會這樣說,[eslint提供了一個可配置的設置來允許'null'檢查的異常](http://eslint.org/docs/rules/eqeqeq)。 – zzzzBov

回答

4

我打算嘗試儘可能客觀地解決這個問題,但它涉及一些糊塗的「最佳實踐」意見,可能會引發人們忘記有多種方法來做事情。

是否可以接受使用類型強制(==代替===)來檢查undefined/null

不管別人告訴你什麼都可以,但是你認爲合適的代碼是可以接受的。包括我。

這在這裏並沒有什麼幫助,所以讓我稍微擴展一下,我會讓你決定你對此的看法。

代碼是可用於解決問題的工具,並且是== JavaScript代碼內的工具來解決一個特定問題。它有一個well-defined algorithm,它用於檢查兩個參數之間的相等類型。

===,在另一方面,是不同工具,解決了不同特定問題。它還有一個well-defined algorithm,它用於檢查兩個參數之間的相等類型。

如果一個工具或其他工具適合您的使用情況,那麼您應該毫不猶豫地使用該工具。

如果您需要錘子,請使用錘子。

但是if all you have is a hammer, then everything looks like a nail,這是==的核心問題。來自其他語言的開發人員通常不知道==如何工作,並在===合適時使用它。

事實上,大多數使用案例都是這樣的,===應該優於==,但正如您在問題中提出的那樣:在這種情況下不是這樣。

缺點是什麼?

如果你放鬆你的===標準,並允許開發人員使用==你很可能得到通過的==誤用,這就是爲什麼宗教堅持===可以接受的一些咬傷,而且似乎愚蠢的人。

if (val === null || val === undefined) {... 

不是特別難寫,而且對意圖非常明確。

另外,

if (val == null) {... 

更加簡潔,不難理解無論是。

是否有更好的方法來檢查undefined/null

「更好」是主觀的,但我會說,「不」,無論如何,因爲我沒有意識到任何有意義的方式改善情況。

在這一點上我也注意到,有可能被執行代替null/undefined其他檢查。 Truthy/falsey檢查是常見的,但它們是用來解決另一個特定問題另一個工具:

if (!val) {... 

是比任何以前的選項簡潔得多,但它帶有吞嚥其他falsey的行李值。通過掉毛執法


其他注意事項:

如果你遵循的Crockford's JSLint的嚴格,==從未的耐受性,在理解是一種工具,是「有時是有用的」,而是「主要危險」 ISN不值得冒險。

ESLint另一方面,通過提供option to allow null作爲特定例外,允許對規則進行更寬鬆的解釋。

2

測試未定義使用typeof理想的方式。注意:您只需要分別測試他們,如果你關心undefinednull之間的差異:

test(null); 
test(undefined); 

function test(myVar) { 
    if (typeof myVar === "undefined") { 
     // its undefined 
    } 
    if (myVar === null) { 
     // its null 
    } 
} 

如果你不介意它undefined/null,然後就去做:

test(null); 
test(undefined); 

function test(myVar) { 
    if (!myVar) { 
     // its undefined or null, dunno which, don't care! 
    } 
} 
+0

您需要'myVar == null'(或'myVar == undefined'),而不是'!myVar';後者也會接受'0',''''''''false'和'NaN' ... – Frxstrem

+0

第二個片段:'undefined','null','0'或其他任何falsey – qxz

+0

注意:第二個例子會吞下一些你可能不想要的東西,比如'0'和'NaN'。如果這是不受歡迎的,請參閱第一個示例。 – Amy

4

== undefined並且== nullboth equivalent以檢查該值是未定義的還是空的,而沒有其他。

至於「可接受」,取決於誰在查看代碼,以及您的linter是否配置爲忽略這種特殊情況。

我可以肯定地告訴你,一些縮小器已經爲你做了這個優化。

+0

如果你想測試一個變量是否是'undefined',那麼你應該使用'typeof'而不是直接測試。這只是一個好習慣。 –

+0

@AaditMShah爲什麼? – qxz

+0

正確的,爲了檢查它是*完全* null還是*完全*未定義,作者似乎已經知道如何做正確的事情:'==='。 – Brian

相關問題