2016-02-11 16 views
2

我有一些代碼,看起來像以下:如果我對「無法讀取屬性'****'未定義'會怎麼樣?

$scope.query.toLowerCase() != 1 

如果沒有定義的查詢 - 有在控制檯中的錯誤。實際上,代碼仍然會產生我想要的結果,但處理錯誤的正確方法是什麼?當然,我可以預先檢查這個變量 - 但是這會導致更多的代碼,而不必確定通過閱讀更多代碼來隱藏錯誤的好處。

+1

[檢測未定義的對象屬性]的可能的重複(http://stackoverflow.com/questions/27509/detecting-an-undefined-object-property) – Hacketo

+2

@Hacketo似乎不像我重複。 –

+0

你應該檢查它,並拋出自己的錯誤,然後處理程序中的錯誤,特別是如果查詢被定義是用戶提供正確輸入的直接後果。如果這種情況不會發生在任何類型的用戶輸入上,那就讓它失敗。 – Neil

回答

3

當然,我可以請預先檢查變量 - 但是,這將導致更多的代碼

編寫更多的代碼,不會使你的代碼不好,除非你是在一個代碼高爾夫比賽。如果你不處理你的錯誤和邊緣情況,那麼你的程序將不可靠。如果一行代碼引發錯誤,您的代碼甚至可能過早終止。

另一種處理可能的未定義屬性的方法是定義一個默認值,而不是檢查它是否爲undefined

($scope.query || "").toLowerCase() != 1  // this is enough to fix your expression 

或更正式

($scope.query === undefined ? "" : $scope.query).toLowerCase() != 1 

顯然,這取決於你的目的是什麼。

又如:

function add(a, b){ 
    return a + (b || 0); // if b is falsy, assume b is 0 
} 

add(1, 2); // 3 
add(1);  // 1 

Shortcircuiting在某些情況下非常有用,但要確保你知道它是如何工作的,因爲濫用會造成意想不到的行爲。

+0

感謝您的詳細解答。當然,我可以解決顯示錯誤的問題,但不想用快速解決方案,而且您的答案可以幫助我提高代碼的可讀性。 – naneri

+0

「定義一個默認值,而不是檢查它是否未定義」。你的例子檢查'$ scope.query'值使用默認值.. – Hacketo

+0

@Hacketo爲了澄清我的意思,而不是使用'if'並引入一個全新的代碼塊,短路是一種更快的捷徑繞過它。 –

1

它不好的做法,做...

try { 
    $scope.query.toLowerCase() != 1 
} catch(e) { 
    // do nothing 
} 

,因爲這掩蓋了錯誤,並意外的錯誤發生,你不會知道這件事情,這使得調試一場噩夢。

批准的做法是編寫一些額外的防線代碼行以防止會導致錯誤的情況。 是的它更詳細,但它比代碼庫這是一個噩夢調試好。

0
一般

:我outsorcing這個任務變成一個小幫手:

function string(v){ return v==null? "": String(v) } 

,我可以肯定,該輸出始終是一個字符串(類型安全)。

string($scope.query).toLowerCase() != 1 

在這種特殊情況下?要檢查對一個號碼,你不需要toLowerCase()

+$scope.query !== 1 

甚至會更好,在這種情況下,不需要處理null或undefined。

相關問題