我一直在审查其他人的代码,虽然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总是被实例化吗?但是,这在上面的函数中没有意义,因此为道具创建的对象将是一个匿名对象,对吗?
非常感谢,
答案 0 :(得分:2)
不,解构中的花括号既不形成块也不形成对象文字。
它们绝对不是一个块,因为它们不是一个声明(并且不包含语句列表),它们是一个表达式,如一个对象文字。事实上,它们甚至具有与对象文字相同的语法,唯一的区别是它们位于赋值目标(赋值运算符的左侧)或函数参数的位置。
let a = ({ a, b }) => {…}
与let a = ( a, b ) => {…}
相同吗?
不,真的不是。两个参数列表都为函数作用域声明了变量a
和b
,但第一个函数需要一个具有属性.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个参数,但是当你调用它时,你只传递一个对象。