2013-03-08 53 views
87

不知道這是Mozilla的特定JS的語法,但我經常發現變量被宣佈這種方式,例如,在add-on SDK docs`var {...} = ...`語句中的大括號是幹什麼的?

var { Hotkey } = require("sdk/hotkeys"); 

和各種鍍鉻的Javascript(let聲明被用於替代的var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; 

我發現它非常混亂,但我沒能找到有關這兩個語法的任何文件,甚至在MDN

+0

@Blender如何在symbolhound.com上搜索此結構? – trusktr 2013-09-02 04:23:38

+1

@trusktr:有點晚:http://symbolhound.com/?q=javascript&l=&e=var+%7B&n=&u= – Blender 2015-06-14 02:08:29

+0

簡短回答在這裏:https://stackoverflow.com/a/45909752/203704 – 2017-08-27 22:10:01

回答

53

它們都是JavaScript 1.7的功能。第一個是block-level variables

let允許你聲明變量,限制其範圍的塊,語句,或在其上使用的表達。這與var關鍵字不同,後者在全局範圍內定義變量,或者在本地定義整個函數,而不考慮塊範圍。

第二個被稱爲destructuring

解構分配使得能夠使用該反射鏡陣列和對象文字的結構的語法提取數組或對象的數據。
...
解構賦值可以做的一件特別有用的事情是在單個語句中讀取整個結構,儘管可以用它們做很多有趣的事情,如示例部分中所示隨後。

對於那些熟悉Python,它類似於此語法:

>>> a, (b, c) = (1, (2, 3)) 
>>> a, b, c 
(1, 2, 3) 

第一個代碼塊是簡寫:

var {Hotkey: Hotkey} = require("sdk/hotkeys"); 
// Or 
var Hotkey = require("sdk/hotkeys").Hotkey; 

您可以重寫第二個代碼塊爲:

let Cc = Components.classes; 
let Ci = Components.interfaces; 
let Cr = Components.results; 
let Cu = Components.utils; 
+1

在我的實驗中,看起來像'var {Hotkey}'相當於'var {Hotkey:Hotkey}'。感謝您查找文檔! – timdream 2013-03-08 10:37:03

+0

@timdream:我有一種感覺就是這樣,但是它與'var Hotkey = require(...)。Hotkey'有什麼不同?或者它只是節省擊鍵? – Blender 2013-03-08 10:38:07

+0

看起來是這樣的: - /(hehehe,這些懶惰的程序員...) – timdream 2013-03-08 10:40:11

0

有關於MDN的let語句文檔:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

let類似於var,因爲它限制了聲明的變量的範圍。它允許你在一個if(){}塊(或其他塊)中聲明一個變量,並且該變量只在該塊內部是「可見的」(JavaScript,直到現在,它具有函數作用域並且不像大多數其他語言那樣阻塞作用域)。所以let基本上是一個「修復」許多人有問題的東西。請注意,tihs是一個JavaScript 1.7功能。

{Foo}上沒有找到任何東西。

+0

謝謝,但我問的是{{Foo}'... – timdream 2013-03-08 09:50:05

+0

對不起,我以爲你的軟件問了兩個...我的google-fu在涉及到{Foo}時失敗了:/ – 2013-03-08 10:00:54

+0

我也是: -/Google不索引'{'和'}'。 – timdream 2013-03-08 10:05:22

56

你在看什麼是破壞環分配。這是一種類似於Haskell的pattern matching

使用解構賦值可以從對象和數組中提取值,並使用對象和數組字面量語法將它們賦值給新聲明的變量。這使得代碼更加簡潔。

例如:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var {a, b, c} = ascii; 

上面的代碼就等於:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var a = ascii.a; 
var b = ascii.b; 
var c = ascii.c; 

類似地,對於數組:

var ascii = [97, 98, 99]; 

var [a, b, c] = ascii; 

這相當於:

var ascii = [97, 98, 99]; 

var a = ascii[0]; 
var b = ascii[1]; 
var c = ascii[2]; 

您也可以使用let如下提取以及重命名對象屬性:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

let {a: A, b: B, c: C} = ascii; 

這相當於:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var A = ascii.a; 
var B = ascii.b; 
var C = ascii.c; 

這一切就是這麼簡單。

+8

+1爲對象解構示例,真的很有幫助。 [MDN示例](https://developer.mozilla.org/zh-CN/docs/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_%28Merge_into_own_page.2Fsection%29)僅顯示數組解構。 – Blender 2013-03-08 10:48:18

+0

@Blender - 他們確實提供了對象解構的例子。看看[__Looping跨對象數組中的值___](https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Looping_across_values_in_an_array_of_objects「JavaScript 1.7新增功能 - JavaScript | MDN」)。 – 2013-03-08 10:56:45

+0

我的意思是'var {a,b,c} = ascii;'語法。 – Blender 2013-03-08 11:00:19

相關問題