2010-12-05 48 views
8

未定義可以將此代碼檢查空/ JavaScript中

if (typeof foo != "undefined" && foo !== null) { } 

安全地重構這個代碼?

if (foo != null) { } 

這是完全一樣的東西嗎? (如果不是,它是如何不同?)

+0

的可能重複的http:/ /stackoverflow.com/questions/801032/null-object-in-javascript – Hps 2010-12-05 18:43:00

+0

@HPS我搜索了SO。這個問題從來沒有被問到。 – 2010-12-05 18:46:27

回答

11

不是真的。如果foo尚未聲明,則會在第二個示例中拋出ReferenceError異常。

在另一方面,你可以安全地檢查是否與typeof操作未定義非聲明的變量。

+0

@Daniel我不明白。如果我有`var foo;`然後運行第二個代碼段,則不會拋出任何錯誤(至少在Chrome中不會)。 – 2010-12-05 18:45:26

2

一個簡單的實驗將回答這個問題:

if(foo != null) { 
    alert('foo not null'); 
} 

上面的例子在許多瀏覽器產生一個JavaScript錯誤:"ReferenceError: Can't find variable: foo"。這是因爲我們使用了一個先前未被聲明爲變量的變量,或者在當前作用域中使用了var

typeof運營商,在另一方面,爲使未被定義的變量的顯式的住宿 - 它返回'undefined',所以:

if(typeof foo != 'undefined') { 
    alert('foo is not defined'); 
} 

按預期工作。

因此,答案是「不」 - 他們不是同樣的事情 - 儘管在一些 JavaScript環境,他們的行爲可能以同樣的方式,在其他環境中你的第二個表單將產生錯誤時foo不定義。

2

變量可以實際持有價值undefined,這是默認值,如果一個變量從未被分配到。所以foo != null將工作,如果你的變量聲明使用var或通過賦值賦予一個值,但如果它不是,你會得到一個ReferenceError。因此,這兩個片段是而不是等效。

如果你可以肯定的是foo聲明,這是安全和更容易理解比你原來的第二個片段,假設無處代碼類似undefined = 42存在:

if(foo !== undefined && foo !== null) { }