我经常看到JavaScript代码,其中函数可以包含在“options”对象中并使用它:
var name = typeof options.name !== 'undefined' ? options.name : "Bob";
这似乎等同于以下内容:
var name = options.name || "Bob";
现在,我了解在某些情况下,你可能真的关心options.name
是undefined
vs null
这对我有意义,但我经常在这种区别的情况下看到这一点没有必要。
我相信我听说人们因为IE中的一些错误而编写这样的代码。有人可以详细说明吗?
答案 0 :(得分:6)
我不知道IE中的错误,但这些陈述并不完全等同:
仅当name
为"Bob"
时,第一个将options.name
变量设置为默认undefined
。
只要name
是假的,第二个就会将"Bob"
变量设置为options.name
。这可以是空字符串,null
值,值0
,NaN
值,布尔值false
以及undefined
。< / p>
例如,如果options.name === 0
,第一个语句会将name
变量设置为0
,而第二个语句会将其设置为"Bob"
。
答案 1 :(得分:2)
我希望它取决于开发者实际打算做什么,而不是他们订阅的任何约定。在很多情况下,较短的name = options.name || "Bob";
最终会给你提供你不期望的值,如果你不知道它的实际行为,因为它会强制options.name
之外的布尔值。在其他情况下,其他“虚假”值将是不可能的(或几乎不可能):例如,如果值来自表单元素,您实际上不必担心undefined
,{{1} },null
或false
- 只要表单元素存在,它应该始终是一个字符串 - 所以这个检查将确保该字段不是一个空字符串(尽管任何字符串)白色空间将通过)。与0
类似的另一种常见模式是options.name || "Bob"
,它具有相同的潜在问题/好处。