2016-08-25 74 views
10

所以有關於S.O的問題。它回答如何檢查對象上的屬性是否存在。 Example答案是使用Object.prototype.hasOwnProperty()如何檢查可能未定義的對象上是否存在屬性?

但是,如何檢查可能未定義的對象的屬性?

如果有人試圖直接檢查某個屬性是否存在於一個未定義的對象上,那麼這將是一個引用錯誤。

從語義上看,直接檢查代碼似乎更好if (obj.prop) //dosomething - 它顯示更清晰的意圖。有什麼辦法可以做到這一點?最好有沒有一個內置的JavaScript方法來做這樣的事情或慣例?

動機:一個包添加屬性user.session.email - 但我檢查是否存在電子郵件,而不是會話,雖然會話可能不存在。

更新:許多答案都說要使用運營商短路的& &。我意識到這是一個可能的解決方案,但它不完全是我們所期望的,因爲它看起來像我們在JS對象語法的周圍工作 - 也就是說,儘管您想真正檢查對象上的屬性,你被迫檢查對象是否存在才能這樣做。

注意標記爲關閉爲什麼標記爲關閉?假設這是重複的鏈接可能不會產生相同的答案。我們正在尋找一個更好,更多的語義解決方案,並將此標記爲「嵌套」===「可能未定義」?

+3

這不會是一個語法錯誤,它會是一個ReferenceError。你可以檢查'obj && obj.prop'。 – Xufox

+2

'obj'變量肯定會存在,但可能只有'undefined'值?順便說一句,測試'if(obj.prop)'不測試一個屬性是否存在,它測試一個屬性是否存在*和*具有真值。 – nnnnnn

+0

啊 - 修正了問題的描述,但問題仍然有效,因爲你本質上是檢查對象和屬性是否存在,當我只是試圖真正檢查屬性是否存在。 – steviejay

回答

9

如果你一定父對象存在,那麼:

if(obj && obj.key) { 
    console.log(obj.key); 
} 

但是,如果obj不存在這個例子就會失敗。

if (obj && obj.key) { 
 
    console.log(obj.key); 
 
}

...這就是爲什麼你可能要檢查的屬性檢查時定義對象。這確保瞭如果條件被擊中並且屬性的對象沒有被設置,你將不會得到運行時錯誤。

if(typeof obj != "undefined" && obj.key) { 
 
    console.log('you will not see this logged') 
 
}

你會發現,上面的例子不會拋出異常。

var obj = {key: 1}; 
 

 
if(typeof obj != "undefined" && obj.key) { 
 
    console.log('we have obj! and val is : ' + obj.key) 
 
}

這是一個更防禦方法,但它允許便攜性。如果您想將邏輯抽取到模塊中以供重用,您可能需要檢查該對象是否存在,或從應用程序的某個區域冒出不必要的錯誤。

+0

如果沒有更清晰的方法來檢查財產,我會接受這個答案(由其他人提交)。 – steviejay

+2

請注意'typeof obj!='undefined''會在'typeof'檢查後的某個位置用'let'或'const'定義'obj'時給出一個引用錯誤。 – nnnnnn

+4

請注意'var a = {a:false,b:0,c:null}'打破了這些測試,因爲'aa'和'ab'和'ac'都被評估爲不真實,所以if(a && aa ){...}'不會認爲它是被定義的,但它是。 – artfulrobot

5

如果要同時檢查的obj和道具存在的(就像你在你的評論中提到),你要做的:

if(obj && obj.hasOwnProperty('some'))if(obj && obj.some)

正如在評論中提到這將引發錯誤,如果obj爲undefined 。一個更好的比較就應該是:

if(typeof obj != "undefined" && obj.hasOwnProperty('some')) 
+0

如果未定義obj,則會引發異常 – user1167442

0

你可以這樣做:

if(user.session && 'email' in user.session) //do something... 

的情況下,你確定用戶定義。

相關問題