2012-05-10 55 views
11

在注視了Mozilla的(Firefox)的一些JavaScript代碼附加SDK,我看到了一種變量聲明我從來沒有見過的:使用Javascript - 分配多個變量,變量聲明中使用大括號對象屬性

var { foo, bar } = someFunction("whatever"); // just an example 

查看變量名稱周圍的大括號?事實證明,這是一種將對象的屬性值同時分配給多個變量的方法。它看起來類似於destructuring assignment或PHP的list,除了使用對象屬性而不是數組。

我實際上是通過一些小竅門找到的,因爲似乎沒有關於它的文檔。看看這段代碼:

function gimmeAnObject() { 
    return { 
     foo: "hey", 
     bar: "sup" 
    }; 
} 

console.log(gimmeAnObject()); // Object { foo="hey", bar="sup" } 

var { foo, bar } = gimmeAnObject(); 

console.log(foo); // hey 
console.log(bar); // sup 

我還發現,這隻適用於Firefox。 Chrome會拋出一個錯誤:「未捕獲的SyntaxError:意外的令牌{」。這解釋了爲什麼我在開始查看Firefox附加代碼之前沒有看到它。

以前有沒有其他人看過這種變量聲明?爲什麼我找不到任何文檔?由於它只適用於Firefox,我認爲這可能是一個Mozilla的事情,但我甚至無法在MDN上找到它。然後,也許我只是不知道要搜索什麼。

+0

[常量聲明與塊]的可能重複(http://stackoverflow.com/questions/10199229/constant-declaration-with-block) –

+1

發現這個問題,同時撰寫我自己的一個幾乎相同的問題:) – Motti

回答

5

綜觀「解構分配」鏈接(即http://en.wikipedia.org/wiki/JavaScript_syntax#Assignmenthttp://dailyjs.com/2011/09/12/destructuring/)它看起來像這樣構建解構賦值。

百科:

In Mozilla's JavaScript, since version 1.7, destructuring assignment allows the assignment of parts of data structures to several variables at once. The left hand side of an assignment is a pattern that resembles an arbitrarily nested object/array literal containing l-lvalues at its leafs which are to receive the substructures of the assigned value.

在JavaScript數組和對象都或多或少相同的,所以它是不是很奇怪,支持陣列結構還支持對象。

+1

呵呵,看起來你是對的。不過,我想知道爲什麼有這麼少的文檔。我想除了Mozilla之外,沒有人會看到解構賦值的有用性。 – grant

0

你不能這樣做。你必須命名var和做這樣的事情:

var myObj = (function(){ 
    return { 
     foo: 'foo', 
     bar: 'bar' 
    }; 
})(); 
+1

你我想是的,是的,但似乎在Firefox中,你可以。嘗試運行我在Firefox中打開的jsFiddle鏈接,並打開控制檯。 – grant

+0

也許Firefox有點寬容,或者它只有一個允許它的自己的實現。但我想這個聲明不是在網絡標準 –

+2

它被添加到網絡標準。等幾年。 ;) –