es6 中函数参数列表中的大括号有什么作用?

IT技术 javascript ecmascript-6
2021-01-16 19:22:23

我一直在我正在处理的代码库中看到类似这样的函数:

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

这究竟是在做什么?我很难在谷歌上找到它,因为我什至不确定这叫什么,或者如何在谷歌搜索中描述它。

3个回答

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

const func = o => {
    var param1 = o.param1;
    var param2 = o.param2;
    //do stuff
}
@Nathan 是的,具体参见Object destructuring 部分但是请注意,对变量的更新不会更新原始对象属性 - 它不像创建对原始值的引用。
2021-03-17 19:22:23
只是为了确保我理解正确,基本上这意味着包含这些属性的对象将被传递到函数中,然后在函数中,可以仅使用它们的名称自动访问这些属性?
2021-03-31 19:22:23
2021-03-31 19:22:23

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

它基本上是简写

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

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

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
>