2016-11-28 49 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」,就像我應該在開始時所做的一樣。 –