ES6命名对象参数解构

时间:2017-03-29 14:10:54

标签: javascript ecmascript-6 arguments destructuring default-arguments

我目前正在使用对象解构模式和ES6 Object Destructuring Default Parameters的答案中描述的默认参数。

(function test({a = "foo", b = "bar"} = {}) {
  console.log(a + " " + b);
})();

我希望能够访问object参数,而无需将其分配给函数体中的变量并明确列出每个键。

(function test({a = "foo", b = "bar"} = {}) {
  const options = {a, b};
  console.log(options);
})();

我尝试命名对象参数,但该函数无法将缺失的密钥解析为默认值。

(function test(options = {a = "foo", b = "bar"} = {}) {
  console.log(options);
})();

在解构为命名参数时似乎忽略了默认参数。

这是ES6规范的一部分吗?有没有办法在函数体中没有附加代码的情况下实现所需的行为?

修改:我删除了一个没有为问题添加上下文的多余示例。

1 个答案:

答案 0 :(得分:4)

老实说,我觉得你过于复杂了。默认参数不是强制性的 - 在这种情况下,如果没有它,您的代码可以更清晰。

我只需将对象options作为参数,并在分配默认值后在函数体内进行解构。

function test(options) {
    options = Object.assign({a: 'foo', b: 'bar'}, options);
    let {a, b} = options;
    console.log(options, a, b);
}

test(); // foo bar
test({a: 'baz'}); // baz bar
test({b: 'fuz'}); // foo fuz
test({c: 'fiz'}); // foo bar

特别关注你的最终片段:

(function test(options = {a: "foo", b: "bar"}) {
  console.log(options);
})({a: "baz"});

问题是当传递的值为undefined时使用默认参数。这里传递的值是{a: "baz"}。那不是undefined,因此忽略默认参数。对象不会自动合并。

更广泛地回答您的问题:无法同时获取对象并在方法的参数中解构其某些属性。坦率地说,我很感激,因为功能签名很难以乍看之下阅读。