Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 理解花括号的上下文';{}';_Javascript_Block_Ecmascript 6_Brackets_Destructuring - Fatal编程技术网

Javascript 理解花括号的上下文';{}';

Javascript 理解花括号的上下文';{}';,javascript,block,ecmascript-6,brackets,destructuring,Javascript,Block,Ecmascript 6,Brackets,Destructuring,我一直在审查其他人的代码,虽然ES2015总体上需要一些习惯,但我一直被解构所困扰 以前,在Javascript中,花括号{}用于块或对象。e、 g //花括号块 如果(){ ... } //Obj中的花括号 var obj={ 答:1,, ... } 但是,在分解过程中,我们一次又一次地看到以下语法: 设a=({a,b})=>{ } 我的问题是,参数容器是一个实际的对象还是一个块? 请解释以下内容是否与上述代码相同: a=(a,b)=>{ } 编辑:从Axel Rauschmayer关于

我一直在审查其他人的代码,虽然ES2015总体上需要一些习惯,但我一直被解构所困扰

以前,在Javascript中,花括号
{}
用于块或对象。e、 g

//花括号块
如果(){
...
}
//Obj中的花括号
var obj={
答:1,,
...
}
但是,在分解过程中,我们一次又一次地看到以下语法:

设a=({a,b})=>{
}
我的问题是,参数容器是一个实际的对象还是一个块? 请解释以下内容是否与上述代码相同:

a=(a,b)=>{
}
编辑:从Axel Rauschmayer关于破坏性的文章中,我的理解(到目前为止)是,我们只是在映射道具。总是换成新的Obj?即:

设a={first:a,second:b}=AnObj;
===
a、 a===AnObj.first;
a、 b==AnObj.second;
以上是正确的吗?obj总是实例化吗?但是,这在上面的函数中没有意义,因此为道具创建的对象将是匿名对象,对吗


非常感谢,

这是用于解构的:

var obj = {a: 1, b: 2},
    add = ({a, b}) => a + b;

console.log(add(obj));  //3

因此,基本上函数中的语句似乎有两个参数,但当调用它时,只传递一个对象。

否,解构中的大括号既不是块,也不是对象文字

它们肯定不是块,因为它们不是语句(并且不包含语句列表),它们是一个类似于对象文字的表达式。事实上,它们甚至具有与对象文字相同的语法,唯一的区别是它们位于赋值目标(赋值运算符的左侧)或函数参数的位置

let a=({a,b})=>{…}
是否与
let a=(a,b)=>{…}
相同

不,真的没有。两个参数列表都为函数作用域声明变量
a
b
,但第一个函数需要一个具有属性
.a
.b
的对象,而第二个函数需要两个参数

我的理解是,我们只是将属性映射到一个新的obj

否。没有创建/实例化新对象。只有您传入的对象(右侧)。然后它被分解成若干部分,然后分配给不同的子目标(变量、属性引用)

a.b = anObj.first;
a.c = anObj.second;
用一个你会用到的解构赋值

({first: a.b, second: a.c}) = anObj;
(括号是区分表达式和块所必需的)

然而,更常见的用例是变量初始化。你可以缩短

let b = anObj.first,
    c = anObj.second;

还有一个缩写,当变量与属性同名时

let first = anObj.first,
    second = anObj.second;
相当于

let {first, second} = anObj;
Is
设a={first:a,second:b}=anObj正确吗

不,那没有多大意义。这会使人沮丧

let a;
a = anObj.first;
b = anObj.second;
a = anObj;

阅读这篇文章,将对你有很大帮助如果你真的想知道在处理一个解构任务时会发生什么,请看一下规范:谢谢你的回答,但是它没有回答问题。我试图理解背景&在破坏过程中实际发生了什么。一个很好的答案澄清了我头脑中的困惑,并产生了一大堆关于我头脑中花括号的问题:)谢谢@Bergi
let a;
a = anObj.first;
b = anObj.second;
a = anObj;