2013-06-18 60 views
1

我有點困惑關於以下括號格式在Javascript:的Javascript括號格式

(listeners = {})[obj._listenerId] = obj; 

當一個對象被包圍括號這是什麼意思?

同一以下

({ 
    value: "\\abc" 
}) 

另一個問題是 - 什麼是隻包含此代碼的文件的含義是什麼? 謝謝! Mary

+0

*「?什麼是隻包含此代碼的文件所指的」 *它不具有一個特定的含義。它看起來有點像一個打破的函數調用,例如沒有函數名稱的JSONP。 –

+0

第二個示例是一個附加到mustache.js框架的文件,名爲backslashes.js - 這裏還有其他類似的示例,它們所做的全部都是用圓括號包裝對象聲明。 – mary

+0

然後它可能只是用來評估文件爲JavaScript。沒有括號,'{...}'會被評估爲* block *,而不是對象字面值,並且會引發語法錯誤。它又是分組操作符,但用於確保將「內容」評估爲表達式。它不是用來改變評估順序的。 –

回答

3

括號是grouping operator。有了它們,您可以更改表達式的評估順序。

(listeners = {})[obj._listenerId] = obj;做的是:

  1. 指定一個空的對象listeners
  2. 將值obj分配給該對象的屬性obj._listenerId

如果沒有括號,表達式將作爲評估(這裏我用括號只是爲了強調計算順序):

listeners = ({}[obj._listenerId] = obj); 

  1. 分配obj的財產obj._listenerId一個空的物體。
  2. 分配objlisteners(賦值表達式的結果是所分配的值)。

我敢打賭,你已經知道從數學表達式的分組操作。 1 + 2 * 3將導致7。但是(1 + 2) * 39*+更高的優先級,你可以改變,隨着分組。

MDN在他們的優先順序提供了table of operators

4

在第一種情況下,括號是簡單而經典地用於更改執行順序,因爲使用括號表示訪問屬性的優先級高於賦值。它使分配首先發生。

因此您的線路相當於

listeners = {}; 
listeners[obj._listenerId] = obj; 

在第二種情況下,很難說沒有更多的代碼,但這些括號可能習慣以避免解析器認爲這是一個代碼塊。該表達式返回一個文字對象。

+0

謝謝!這回答了第一部分。你有一個鏈接,在JavaScript中指定此語法? – mary

+0

如果你想要一個關於使用圓括號來分隔表達式(從而改變執行順序)的鏈接,Felix提供的可能是好的。 –

0

使用括號,以便首先評估它們內部的部分。例如(listeners = {})將返回新偵聽器的空對象。

0

這是一個簡短的註釋:

listeners = {}; 
listeners[obj._listenerId] = obj; 

你可以試試這個:

(sameObj={})['key']='value'; 
console.log(sameObj)