函数参数列表中的大括号在 es6中是做什么的?

我一直在一个我正在研究的代码库中看到这样的函数:

const func = ({ param1, param2 }) => {
//do stuff
}

这到底是在干什么?我很难在谷歌上找到它,因为我甚至不知道它叫什么,或者如何在谷歌搜索中描述它。

33282 次浏览

它是 解体,但是包含在参数中。没有解构的等价物将是:

const func = o => {
var param1 = o.param1;
var param2 = o.param2;
//do stuff
}

这是将对象作为属性传递。

它基本上是

let param1 = someObject.param1
let param2 = someObject.param2

不带参数地使用这种技术的另一种方法是下面的方法,让我们考虑一下 some Object 确实包含这些属性。

let {param1, param2} = someObject;

它是一个对象解构赋值。像我一样,您可能会发现它令人惊讶,因为 ES6对象解构语法看起来像,但不像对象文字构造。

它支持非常简洁的表单,以及重命名字段和默认参数:

实际上,它是{ oldkeyname: newkeyname = defaultvalue,... } .’:’不是键/值分隔符;’=’是。

这种语言设计决策的一些后果是,您可能必须执行以下操作

; ({ a,b } = some _ object) ;

额外的括号阻止将左花括号解析为一个块,前面的分号阻止将括号解析为对前一行中的函数的函数调用。

更多信息见: Https://developer.mozilla.org/en-us/docs/web/javascript/reference/operators/destructuring_assignment

注意,对象解构赋值过程中的键错误不会抛出; 您只会得到“未定义”的值,无论是键错误还是其他作为“未定义”悄悄传播的错误。

> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
>