2010-09-01 82 views
7

我經常看到的JavaScript代碼,其中一個功能可能需要在「選項」對象,並使用它像:的JavaScript未定義檢查

var name = typeof options.name !== 'undefined' ? options.name : "Bob"; 

這似乎將是等同於以下:

var name = options.name || "Bob"; 

現在,我知道在某些情況下,您可能會注意options.nameundefinednull,這對我來說很有意義,但我經常在沒有必要區分這種情況下看到這一點。

我相信我聽說過人們編寫這樣的代碼是因爲IE中存在一些bug。有人可以詳細說明嗎?

回答

6

我不知道在IE中的bug,但這些聲明並不能完全等同:

  • 第一個name變量設置爲默認"Bob"只有當options.nameundefined

  • 第二個將name變量設置爲"Bob",只要options.name是假的。這可以是一個空字符串,值爲null,值爲0,NaN值,布爾值爲false,還有undefined

例如,如果options.name === 0,第一條語句將name變量設置爲0,而第二個語句將其設置爲"Bob"

2

我希望這將取決於開發者實際打算做什麼,而不是他們訂閱的任何約定。在很多情況下,如果您不知道其實際行爲,因爲它強制排除options.name之外的布爾值,所以較短的name = options.name || "Bob";可能最終會給您提供您不期望的值。在其他情況下,其他「虛假」值將不可能(或幾乎不可能):例如,如果值來自表單元素,則您並不需要擔心undefined,null,false0 - 它應該總是一個字符串,只要表單元素存在 - 所以這個檢查會做什麼是確保該字段不是空白字符串(儘管任何空白將通過)。與options.name || "Bob"類似的另一種常見模式是if (options.name) {...},其具有相同的潛在問題/好處。

相關問題