2016-11-28 90 views
1

我正在查看一些JavaScript文件。他们中有些人有东西在一开始有趣:“|| {}”在JavaScript文件的开头是什么意思

var something = something || {}; 

哪里“东西”显然是一种varable的名字。这是什么意思?它有什么作用?事实上,一个文件有这个,没有别的。

回答

0

这是“something”变量的默认值。 所以如果有东西没有初始化,它最终会包含一个空白对象({})。

换言之,something equals(sometging或{}),其中undefined的计算结果为false,因此返回{}。

6

这是一种常见模式,用于确保变量存在,如果不存在,则将其设置为已知的初始值,以便稍后使用。特别是:

  • 如果变量something已经有值不是falsy,这条线离开变量的值保持不变。

  • 如果此变量something没有值或者是虚假的,则此行将该变量的值设置为{}

在向脚本中的对象添加属性时,您会看到很多这种模式。假设您曾为Acme公司工作,并且您有许多脚本文件可与其他人的代码进行集成。 Acme对象会有一堆属性和一堆函数。在某些脚本中,您可能需要向该对象添加属性。但你不能只说

Acme.TIMEOUT = 300; 

在文件的顶部,因为该变量可能不存在。但是如果确实存在,则要使用现有变量。如果没有,则需要先创建一个新对象。

所以

var Acme = Acme || {}; 

将保证它的存在,然后你可以使用它。

不过要小心。我不喜欢这种模式,因为在现代JavaScript中(我们使用letconst而不是var),具有未定义的变量会导致抛出错误。你应该说:

window.Acme = window.Acme || {}; 

,如果你是在浏览器中。原因是它明确表示Acmewindow对象的属性。引用一个对象的不存在的属性是无害的,你只需要undefined。但引用一个不存在的变量会在现代JavaScript中引发错误(或者,如果不是,它应该)。

+2

'var Acme = Acme || {};'不会抛出错误。 'Acme'变量保证存在,因为它之前有'var'。 – JLRishe

+0

完全正确,谢谢。它使用'let'和'const'失败。恕我直言,使用这种模式只是为了利用'var'高度宽容的语义。虽然var _does_以这种方式工作,但它可能不应该。:)我已经更新了我的答案,以便将我使用“现代”JavaScript的含义限定为“使用let和const而不是var”,就像我应该在开始时所做的一样。 –