理解卷曲括号的背景' {}'

时间:2016-02-07 11:14:27

标签: javascript block ecmascript-6 brackets destructuring

我一直在审查其他人的代码,虽然ES2015总体上正在考虑使用,但是,我仍然坚持使用Destructuring。

以前,在Javascript中,Curly Brackets {}用于块或对象。 e.g。

// Curly Brackets Block
If () {
  ...
}

// Curly Brackets in Obj
var obj = {
  a : 1,
  ...
}

然而,在解构中,我们一次又一次地看到以下语法:

let a = ({ a, b }) => {
}

我的问题是,参数容器是实际对象还是块? 请解释以下内容是否与上述代码相同:

let a = ( a, b ) => {
}
编辑:我对阅读Axel Rauschmayers关于Destruturing的文章的理解(到目前为止)是我们只是在绘制道具。进入一个新的Obj总是?即:

let a = { first : a, second : b } = AnObj;
===
a.a === AnObj.first;
a.b === AnObj.second;

以上是否正确? obj总是被实例化吗?但是,这在上面的函数中没有意义,因此为道具创建的对象将是一个匿名对象,对吗?

非常感谢,

2 个答案:

答案 0 :(得分:2)

不,解构中的花括号既不形成块也不形成对象文字。

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

  

let a = ({ a, b }) => {…}let a = ( a, b ) => {…}相同吗?

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

  

我的理解是我们只是将属性映射到一个新的对象?

没有。没有创建/实例化的新对象。只有你传入的物体(右手边)。它是 destructured - "拉开" - 分成随后分配给各个子目标(变量,属性引用)的片段。

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

使用

进行解构分配
({first: a.b, second: a.c}) = anObj;

(括号是区分表达式和块的必要条件。)

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

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

let {first: b, second: c} = anObj;

当变量与属性同名时,还有一个简写,所以

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

相当于

let {first, second} = anObj;
  

let a = { first : a, second : b } = anObj;是否正确?

不,这没有多大意义。它会贬低

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

答案 1 :(得分:0)

用于解构:

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

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

所以基本上对于函数内部的语句,它会出现2个参数,但是当你调用它时,你只传递一个对象。