2017-08-10 199 views
0

我最近遇到了JavaScript Namespaces,以及如何使用它們來創建像其他流行的OOP語言一樣的名稱空間。我對他們如何申報感到困惑。例如,JavaScript名稱空間對象文字

var myNamespace = myNamespace || {};

創建一個命名空間稱爲myNamespace如果尚未創建它。如果它被創建,只需將其傳入var myNamespace

我很難理解myNamespace || {}究竟做了什麼。

首先不確定myNamespace?你會如何比較布爾表達式。

另外,對象字面值{}是如何工作的?它是否創建一個空對象並將其分配給myNamespace以作爲命名空間工作?

我試過尋找關於SO的答案,但是關於如何聲明不同類型的命名空間的做法存在太多飽和。

+0

undefined || {} === {}。是的,{}只是一個空對象 – juvian

+0

'||'是「或」。 「如果myNamespace已被定義,則將其分配給myNamespace,否則將myNamespace分配給一個空對象。 –

+0

這種命名空間的方法已經被ES6模塊所淘汰。 – 2017-08-10 19:21:27

回答

1

雖然||原本打算用布爾工作,它是在允許它的工作設置默認值一個非常方便的方式來實現:

function or(a, b) { 
    if (a) return a 
    else return b 
} 

你可以在你的腦袋測試這一點,並看到它與布爾值一起工作:如果atrue,結果是true所以結果與a相同。如果afalse那麼結果取決於b

JavaScript中的變量聲明var工作有點奇怪。您可以在同一範圍內重新聲明具有相同標識符的變量。所以代碼的工作方式是:

  • 如果已經聲明瞭myNamespace,那麼您將重新聲明該變量而不分配給它。您可以從舊的myNamespace聲明中獲得價值。這個值被假定爲truthy,所以||將返回它。
  • 如果myNamespace尚未聲明,則聲明它,然後myNamespace將爲undefined,這是一個虛假值。因此,||將返回第二個值{},這是將分配給myNamespace的值。

它可能是有意義的在兩個單獨的步驟來閱讀:

//Declare the variable if it doesn't exist, 
//without overwriting an existing value 
var myNamespace 
//Take the value of myNamespace (undefined if it didn't exist yet) 
//and replace it with {} if it is falsy 
myNamespace = myNamespace || {} 
2

var myNamespace = myNamespace || {};

請問你說的正是它。

||是看到here

那麼這是在做一個or運營商,說var myNamespace = myNamespace但是,如果myNamespace是不確定的,那麼它就會轉到操作者的右手邊,只是創建一個空像這樣的對象(你說得對,這一點):

var myNamespace = {}

讓我知道如果我似乎感到困惑,我想我解決您的觀點。

1

看看的||定義從here

表達式1 || expr2

返回expr1是否可以轉換爲true;否則,返回 expr2。

現在嘗試

console.log(undefined == true); 

這將打印false,這意味着undefined不能轉換到true(我們使用的是==操作,讓JavaScript中使用強制類型轉換)。因此,如果myNamespace未定義,則會爲其分配一個空的對象字面值(相當於引用中的expr2)。