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

Nat*_*han 98 javascript ecmascript-6

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

const func = ({ param1, param2 }) => {
  //do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*rpe 98

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

const func = o => {
    var param1 = o.param1;
    var param2 = o.param2;
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 为了确保我理解正确,基本上这意味着包含这些属性的对象将被传递到函数中,然后在函数内,只需使用其名称就可以自动访问属性? (10认同)
  • @Nathan是的,具体参见[关于对象解构的部分](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring).但请注意,对变量的更新不会更新原始对象属性 - 它不像是在创建对原始值的引用. (7认同)
  • @JamesThorpe最好链接到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Unpacking_fields_from_objects_passed_as_function_parameter (2认同)

Oz *_*uez 6

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

它基本上是简写 __CODE__

使用这种没有参数的技术的另一种方法如下,让我们考虑一下someObject确实包含那些属性. __CODE__


And*_*ner 5

它是一个对象解构赋值。像我一样,您可能会感到惊讶,因为 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
> 
Run Code Online (Sandbox Code Playgroud)