理解卷曲括号'{}'的语境

Kay*_*ote 6 javascript brackets block destructuring ecmascript-6

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

以前,在Javascript中,Curly Brackets {}要么用于块或对象.例如

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

// Curly Brackets in Obj
var obj = {
  a : 1,
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

let a = ({ a, b }) => {
}
Run Code Online (Sandbox Code Playgroud)

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

let a = ( a, b ) => {
}
Run Code Online (Sandbox Code Playgroud)

编辑:我从阅读Axel Rauschmayers关于Destruturing的文章(到目前为止)的理解是,我们只是绘制道具.进入一个新的Obj总是?即:

let a = { first : a, second : b } = AnObj;
===
a.a === AnObj.first;
a.b === AnObj.second;
Run Code Online (Sandbox Code Playgroud)

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

非常感谢,

Ber*_*rgi 2

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

\n\n

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

\n\n
\n

let a = ({ a, b }) => {\xe2\x80\xa6}相同的let a = ( a, b ) => {\xe2\x80\xa6}

\n
\n\n

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

\n\n
\n

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

\n
\n\n

不。没有创建/实例化新对象。只有您传入的对象(右侧)。而且它是解构的——“拆开”——分成碎片,然后分配给各个子目标(变量、属性引用)。

\n\n

来写

\n\n
a.b = anObj.first;\na.c = anObj.second;\n
Run Code Online (Sandbox Code Playgroud)\n\n

与您使用的解构赋值

\n\n
({first: a.b, second: a.c}) = anObj;\n
Run Code Online (Sandbox Code Playgroud)\n\n

(括号是区分表达式和块所必需的)。

\n\n

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

\n\n
let b = anObj.first,\n    c = anObj.second;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
let {first: b, second: c} = anObj;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
let first = anObj.first,\n    second = anObj.second;\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于

\n\n
let {first, second} = anObj;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

不,这没有多大意义。它会脱糖

\n\n
let a;\na = anObj.first;\nb = anObj.second;\na = anObj;\n
Run Code Online (Sandbox Code Playgroud)\n