不知道这是Mozilla的特定JS的语法,但我经常发现变量被宣布这种方式,例如,在附加SDK文档 :
var { Hotkey } = require("sdk/hotkeys");
在各种镀铬的Javascript( let
语句代替使用var
)
let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
我发现它非常混乱,但我没能找到有关这两个语法的任何文件,甚至在MDN 。
他们都是1.7的JavaScript功能。 第一个是块级别的变量 :
let
你可以定义变量,限制其范围来将挡,声明,或在其上使用的表达。 这不像var
关键字,无论块范围的限定全球范围内,或局部变量来整函数。
第二个被称为解构 :
解构分配使得能够使用该反射镜阵列和对象文字的结构的语法提取数组或对象的数据。
...
你可以用解构赋值做一个特别有用的事情是在一个单独的语句来读取整个结构,但也有一些有趣的事情,你可以与他们无关,如图中充满了如下例子部分。
对于那些熟悉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。
使用解构赋值,你可以提取对象和数组值,并将它们分配给使用对象和数组文本语法新声明的变量。 这使得代码更简洁。
例如:
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;
这里的所有都是它的。
这是在JavaScript中自毁分配,并且是ES2015标准的一部分。 然后解压缩或从对象到不同的变量提取从阵列或属性的值。 例如: 数组解构
var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];
//与解构变种[一,二,三] = FOO
例如: 对象解构
有O = {P = 42,Q:真}; 有{P,Q} = 0;
的console.log(P); // 42的console.log(Q); //真
//分配新的变量名VAR {P:FOO,Q:巴} = 0;
的console.log(FOO); // 42的console.log(巴); //真
没有为文档let
在MDN声明: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let
let
类似var
的,因为它限制了声明的变量的范围。 它允许你来声明一个变量里面if(){}
块(或其他块),并有可变的只有“看得见”是块内(JavaScript的,到现在为止,有功能范围,而不是阻止范围,因为大多数其他语言) 。 所以, let
基本上是一个“修复”的东西,很多人都有问题进行。 需要注意的是tihs是一个JavaScript 1.7功能。
还没有找到任何东西{Foo}
。