var {…} = …`语句中的花括号是干什么的?

不知道这是否是一个特定于Mozilla的JS语法,但是我经常用这种方法发现variables,例如,在附加SDK文档中 :

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

和在各种铬的JavaScript( let声明正在使用的地方var ),

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

我发现它很混乱,但我无法find任何有关这两种语法的文档,即使在MDN上也是如此 。

对于知道这一点的人来说,我一定听起来很愚蠢……任何人都可以指出正确的方向吗?

他们都是JavaScript 1.7的function。 第一个是块级variables

let允许你声明variables,把它的范围限制在它所使用的块,语句或expression式上。 这与var关键字不同, var关键字全局定义variables,或者在本地定义整个函数,而不考虑块范围。

第二个被称为解构

解构赋值可以使用反映数组和对象文字构造的语法从数组或对象中提取数据。

解构赋值可以做的一件特别有用的事情就是在单个语句中读取整个结构,尽pipe可以用它们做很多有趣的事情,如下面的例子部分所示。

对于那些熟悉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; 

你在看什么是解构分配。 这是一种类似于Haskell的模式匹配 。

使用解构赋值,您可以从对象和数组中提取值,并使用对象和数组字面量语法将它们赋值给新声明的variables。 这使得代码更加简洁。

例如:

 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; 

这就是它的全部。

有关MDN的let语句的文档: https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

let类似于var ,它限制了声明variables的范围。 它允许你在if(){}块(或者其他块)中声明一个variables,并且在那个块里面只有“可见”的variables(JavaScript,直到现在,函数的作用域并没有像大多数其他语言那样阻塞范围) 。 因此, let基本上是一个“修复”许多人有问题的东西。 请注意,tihs是一个JavaScript 1.7function。

{Foo}上找不到任何东西。