2012-12-19 113 views
47

Possible Duplicate:
How can I check whether a variable is defined in JavaScript?
Is there a standard function to check for null, undefined, or blank variables in JavaScript?JQuery/Javascript:檢查是否存在var

我有一個腳本發生在兩個部分。

第一部分建立一個變種:

var pagetype = "textpage"; 

第二部分是一個簡單的if語句:

if(pagetype == "textpage") { 
//do something 
}; 

現在的第二部分,if語句,出現在所有頁面我現場。但是,聲明var的第一部分只出現在我的一些頁面上。

在頁面上沒有VAR我自然得到這個錯誤:

Uncaught ReferenceError: pagetype is not defined 

所以我的問題是:是否有JavaScript或JQ的路要走,如果一個變種存在於所有檢測(不只是如果有分配給它的數據)?

我想象如果statment我只想用另一個,如:

if ("a var called pagetypes exists").... 
+1

'typeof',','大部分window.hasOwnProperty'如果(VAR X)'... –

+1

你會得到很多回答這個問題,我認爲這將是正確的...我投了這個問題,因爲它很高興看到一個'正確的'嘗試在錯誤處理... – Zak

回答

92

我懷疑有很多答案,這樣對左右,但在這裏你去:

if (typeof pagetype !== 'undefined' && pagetype == 'textpage') { 
    ... 
} 
+0

if(var pagetype ==「textpage」)...''? –

+10

@JanDvorak:可以肯定,這是無效的JS ... – elclanrs

+2

這並不測試是否已經聲明'pagetype',只是它的值的類型不是未定義的。 – RobG

16

您可以使用typeof

if (typeof pagetype === 'undefined') { 
    // pagetype doesn't exist 
} 
4

爲了測試存在,有兩種方法。

a。 "property" in object

此方法檢查原型鏈是否存在屬性。

b。 object.hasOwnProperty("property")

此方法不會檢查原型鏈以檢查屬性的存在性,它必須存在於您要調用該方法的對象中。

var x; // variable declared in global scope and now exists 

"x" in window; // true 
window.hasOwnProperty("x"); //true 

如果我們使用下面的表達式,然後它會返回false

typeof x !== 'undefined'; // false 
+1

只有在全局範圍內定義'pagetype'時纔可以使用 –

+2

這也適用於瀏覽器,但不適用於Node.js。嘗試使用'this'而不是'window'。 –

+0

@ Bruno-你的方法a不檢查變量的存在,方法b只對全局屬性有用,其中一些可能是變量。 – RobG

2

每個條件語句在測試之前,你可以做這樣的事情:

var pagetype = pagetype || false; 
if (pagetype === 'something') { 
    //do stuff 
} 
+0

假設您不介意將'pagetype'定義爲OFC的副作用。 –

+0

這只是一種方法。這樣,如果不存在條件,它至少會默認失敗。 – Jason

+0

對於'pagetype'這樣的'''''''',''''''等''''''''''''''''''''如果'pagetype'已經被聲明並且被設置爲這些值之一,那麼''false'並會導致不正確的比較。 – Ian

3

這是不可能確定一個變量是否已經被聲明或者沒有被使用,除非使用try..catch導致一個錯誤,如果它沒有被聲明的話。測試,如:

if (typeof varName == 'undefined') 

不告訴你,如果varName的範圍是一個變量,只用typeof該測試返回undefined。例如

var foo; 
typeof foo == 'undefined'; // true 
typeof bar == 'undefined'; // true 

在上面,你不能說foo被宣佈,但bar不是。您可以測試使用in全局變量:

var global = this; 
... 
'bar' in global; // false 

但全球的對象是唯一的變量對象*您可以訪問,你不能訪問任何其他執行上下文的變量對象。

解決方法是始終在合適的上下文中聲明變量。

  • 全局對象並不是一個真正的變量對象,它只是具有匹配全局變量的屬性並提供對它們的訪問,所以它看起來只是一個。
+1

另一種情況是drive-by down選民誰不能解釋爲什麼。 – RobG

8

對於您的情況以及所有其他人的99.9%elclanrs答案是正確的。

但由於undefined是一個有效的值,如果有人來測試未初始化的變量

var pagetype; //== undefined 
if (typeof pagetype === 'undefined') //true 

唯一的100%可靠的方法來確定是否存在變量被捕獲異常;

var exists = false; 
try { pagetype; exists = true;} catch(e) {} 
if (exists && ...) {} 

但我絕不會寫這樣

+1

如果你downvote,證明答案錯了 – jermel

+0

^^ if(typeof pagetype ==='undefined')// false' – elclanrs

+1

嘆...錯別字:-),即使它仍然是真實的 – jermel