繁体   English   中英

了解弯括号“ {}”的上下文

[英]Understanding the Context of Curly Brackets '{}'

我一直在审查其他人的代码,而总体而言,ES2015可以得到一些利用,但是,我一直沉迷于Destructuring。

以前,在Javascript中,“花括号” {}用于块或对象。 例如

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

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

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

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

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

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

编辑:从阅读Axel Rauschmayers关于破坏的文章(到目前为止)我的理解是,我们只是在绘制道具。 总是变成新的Obj? 即:

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

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

非常感谢,

不,解构过程中的花括号不会形成块或对象文字。

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

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

不,真的不是。 两个参数列表的确声明了函数作用域的变量ab ,但是第一个函数期望一个对象具有.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: 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;

它用于销毁:

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

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

因此,基本上在函数内部的语句中会出现两个参数,但是调用它时,只会传递一个对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM