2011-11-04 142 views
21

我有一個需要3個參數的函數,我遇到的問題是其中一個參數是Object的一個有時未定義的值的屬性(即,它需要在?thing.foo.bar,有時thing.foo是不確定的,所以它不能訪問酒吧Javascript「can not read property」bar「undefined

有什麼解決的辦法在函數的聲明,我有一個條件檢查: if (!parameterName),但瀏覽器(Chrome)仍然拋出一個錯誤,說它無法讀取酒吧屬性undefined。

謝謝!

+1

我想我有點理解,但不是真的......你可以發佈你的代碼嗎? –

回答

32

如果一個對象的屬性可以參考一些其他的對象,那麼你可以嘗試使用其屬性之前測試未定義我的回答更好地反映了你的情況,如果你顯示一些實際的代碼,但可能是這樣的:

function someFunc(parameterName) { 
    if (parameterName && parameterName.foo) 
     alert(parameterName.foo.bar); 
} 
+0

@Mörre:這工作得很好。 OP明確指出'thing.foo'是未定義的,所以它需要聲明。 – Cerbrus

6

複方檢查:

if (thing && thing.foo) 
    alert(thing.foo.bar); 

我可以更新:

if (thing.foo && thing.foo.bar) { 
     ... thing.foor.bar exists; 
    } 
+1

這是一個語法錯誤..它應該是'thing.foo && thing.foo.bar' – Reid

+0

謝謝。固定..深夜。 –

2

在你傳遞給你的函數之前請檢查它。所以,你會傳遞:

thing.foo ? thing.foo.bar : undefined 
7

可以維護自己的任一方法有兩種:

function myFunc(thing) { 
    if (thing && thing.foo && thing.foo.bar) { 
     // safe to use thing.foo.bar here 
    } 
} 

function myFunc(thing) { 
    try { 
     var x = thing.foo.bar; 
     // do something with x 
    } catch(e) { 
     // do whatever you want when thing.foo.bar didn't work 
    } 
} 

在第一個例子,你明確地檢查你參考,使變量的所有可能的元素在使用它之前確保它是安全的,所以你不會得到任何意外的參考例外。

在第二個示例中,您只需在其中放置一個異常處理程序。假設它存在,您只需訪問thing.foo.bar。如果它確實存在,那麼代碼正常運行。如果它不存在,那麼它會拋出一個你會忽略的異常。最終結果是一樣的。如果thing.foo.bar存在,則使用它的代碼將執行。如果它不存在代碼不執行。在所有情況下,該功能正常運行。

if語句執行速度更快。在可能有許多可能的情況需要防範並且代碼結構化的複雜情況下,異常可以更簡單地進行編碼和使用,以便引發異常並處理它是在某些數據不存在時跳過執行的乾淨方式。拋出異常時,異常會慢一點。

相關問題