[英]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 ) => {…}
吗?
不,真的不是。 两个参数列表的确声明了函数作用域的变量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: 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.