2014-01-10 47 views
0

這裏typeof undefined。哪個更快更好?

var a = {} 

if(typeof a.b == "undefined"){ 
    console.log("undefined"); 
} 

if (!a.b){ 
    console.log("undefined"); 
} 

都返回"undefined"

if(typeof c.b == "undefined"){ 
    console.log("undefined"); 
} 

if (!c.b){ 
    console.log("undefined"); 
} 

既能提高錯誤c is not defined

它看起來像2上述陳述的工作原理是相同的。那麼哪種方式更好?

回答

2

如果你正在尋找一種方法來檢查是否存在會員,你應該使用in操作

if ("b" in a) { 
    ... 
} 

錯誤c is not defined提高,因爲c沒有在程序的任何地方定義。

typeof a.b將返回什麼,是存儲在a.b中的數據的類型。如果b實際存在且實際上保存值undefined會怎樣? typeof a.b!a.b都將評估爲真值。所以,他們不應該用於成員存在檢查。

請檢查this answer瞭解爲什麼in應該是首選會員存在。

+0

昨天同一個問題xD –

+0

@EdgarVillegasAlvarado yup:P Dup投票。 – thefourtheye

0

我會用in操作

if ('b' in a) { 
    ... 
} 

我會使用它,因爲它做正是爲了檢查是否在對象存在的屬性,因爲它比其他人(IMO)更具有可讀性。

但是,哪個更快並不重要因爲您會進行微優化(除非您的操作數百萬或數十億次)。

乾杯

PS:c is not defined是因爲與c.b你試圖存取權限的不確定變量的b成員(c

0

我不知道你想達到什麼樣的,但有兩個問題。第一部分是檢查在對象中定義的屬性。第一個if檢查是否定義了屬性的類型,但它可能是故意的「未定義」。

用於檢查對象是否有屬性。

if(b.hasOwnProperty("c")) { 

} 

如果你想在整個原型鏈「查找」的屬性然後使用in

if ("c" in b) { 

} 

否則檢查BC的是「未定義」表示該值由「BC」返回是「未定義」類型的。這並不意味着b有或沒有財產「c」。

由於未在全局範圍內定義「c」,第二個塊失敗。您無法訪問會導致錯誤的未定義對象的屬性。

如果你沒有原型鏈,hasOwnProperty應該是在大多數情況下更快。

+0

請記住,這會返回對象原型中屬性的false。 – tenub

+0

我已經編輯了答案。 –