Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript `var{…}=…`语句中的花括号起什么作用?_Javascript_Ecmascript 6_Destructuring_Javascript 1.7 - Fatal编程技术网

Javascript `var{…}=…`语句中的花括号起什么作用?

Javascript `var{…}=…`语句中的花括号起什么作用?,javascript,ecmascript-6,destructuring,javascript-1.7,Javascript,Ecmascript 6,Destructuring,Javascript 1.7,不确定这是否是Mozilla特有的JS语法,但我经常发现变量以这种方式声明,例如: 在各种chrome Javascript中(let语句被用来代替var) 我发现它非常混乱,但我找不到任何关于这两种语法的文档,即使是在上。有关于MDN上的let语句的文档: let类似于var,因为它限制了声明变量的范围。它允许您在if(){}块(或其他一些块)内声明一个变量,并使该变量在该块内仅“可见”(到目前为止,JavaScript与大多数其他语言一样具有函数作用域而非块作用域)。因此,let基本上是对许

不确定这是否是Mozilla特有的JS语法,但我经常发现变量以这种方式声明,例如:

在各种chrome Javascript中(
let
语句被用来代替
var


我发现它非常混乱,但我找不到任何关于这两种语法的文档,即使是在上。

有关于MDN上的
let
语句的文档:

let
类似于
var
,因为它限制了声明变量的范围。它允许您在
if(){}
块(或其他一些块)内声明一个变量,并使该变量在该块内仅“可见”(到目前为止,JavaScript与大多数其他语言一样具有函数作用域而非块作用域)。因此,
let
基本上是对许多人有问题的东西的“修复”。请注意,tihs是JavaScript 1.7的一个特性


{Foo}

上没有找到任何内容,它们都是JavaScript 1.7的功能。第一个是:

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;

你看到的是一个分解任务。这是哈斯凯尔的一种类似形式

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

例如:

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 = ascii[0];
var b = ascii[1];
var c = ascii[2];
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 = {
    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 = ascii[0];
var b = ascii[1];
var c = ascii[2];
var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;
还可以按如下方式提取和重命名对象特性:

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

var {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;
var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];
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"];
var one = foo[0];
var two = foo[1];
var three = foo[2];
        
var[one,two,three] = foo
var o = {p: 42, q: true};
var {p, q} = o;    
console.log(p); //42
console.log(q); //true 

//Assign new variable names
var {p: foo, q: bar} = o;    
console.log(foo); //42
console.log(bar); //true
不进行分解

var foo = ["one", "two", "three"];
var one = foo[0];
var two = foo[1];
var three = foo[2];
        
var[one,two,three] = foo
var o = {p: 42, q: true};
var {p, q} = o;    
console.log(p); //42
console.log(q); //true 

//Assign new variable names
var {p: foo, q: bar} = o;    
console.log(foo); //42
console.log(bar); //true
具有分解功能

var foo = ["one", "two", "three"];
var one = foo[0];
var two = foo[1];
var three = foo[2];
        
var[one,two,three] = foo
var o = {p: 42, q: true};
var {p, q} = o;    
console.log(p); //42
console.log(q); //true 

//Assign new variable names
var {p: foo, q: bar} = o;    
console.log(foo); //42
console.log(bar); //true
对象分解

var foo = ["one", "two", "three"];
var one = foo[0];
var two = foo[1];
var three = foo[2];
        
var[one,two,three] = foo
var o = {p: 42, q: true};
var {p, q} = o;    
console.log(p); //42
console.log(q); //true 

//Assign new variable names
var {p: foo, q: bar} = o;    
console.log(foo); //42
console.log(bar); //true

+1对于对象分解示例,它们非常有用。唯一的例子是数组分解。@Blender-他们提供了对象分解的例子。看,我指的是
var{a,b,c}=ascii语法。最后一个例子真的很奇怪,因为通常冒号左边的是被分配的内容。@Blender你会如何在symbolhound.com上搜索这个结构?@trusktr:有点晚了:简短的回答是:我对基本解构没问题。然而,在本例中,我们还将值分配给不同的属性名,这种语法非常混乱。它与对象创建语法相反,这增加了更多的混乱。这是否回答了您的问题?此外,使用这种不常见的语法会让一切变得更加神秘。编写代码很容易,但编写人类可以阅读的代码却很难。我们需要构造使它更难吗?@Blender它需要更少的字符来输入,使您的文件更小。对于可供公众下载的非常大的脚本,尽可能减少文件大小始终是一个好主意。我知道这条评论是在我回复的那条评论之后的5年半,但我觉得它仍然值得放在这里,让其他人看看他们是否偶然发现了这条答案和评论线索