2010-09-01 113 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) {...},其具有相同的潜在问题/好处。