【问题标题】:ES6 Named Object Parameter DestructuringES6 命名对象参数解构
【发布时间】:2017-08-23 02:08:09
【问题描述】:

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

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

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

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

我尝试命名对象参数,但该函数失去了将丢失的键解析为其默认值的能力。

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

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

这是 ES6 规范的一部分吗?有没有一种方法可以在函数体中不添加额外代码来实现所需的行为?


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

【问题讨论】:

  • 默认参数用于解构变量。如果您想将它们保留为对象属性,则需要在正文中执行此操作 - 正如答案所解释的那样。
  • @estus 你有该信息的来源吗?这是一个关于 ES6 规范的技术问题,而不是一般的编程实践。
  • 无来源,这是根据 ES6 解构的能力得出的结论。您尝试做的事情不能单独由函数签名处理,应该在函数体中完成。顺便说一句,第二次 sn-p 中的显式重组本身并不是一件坏事。它允许从对象中排除无效键。
  • 你的第三个 sn-p 像 function test(options = ({a = "foo", b = "bar"} = {})) 一样工作——这不是你想要的
  • @Bergi 这是有道理的。如果您将其发布为答案,我会选择它。

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


【解决方案1】:

老实说,我认为你过于复杂了。默认参数不是强制性的——在这种情况下,没有它你的代码会更干净。

我会简单地将对象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

特别是关于你最终的 sn-p:

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

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

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

【讨论】:

  • 感谢您的实际回答,但我最感兴趣的是为什么我提到的语法是有效的,但会产生意想不到的结果。
  • @JaredDeckard 在这种情况下,也许你可以让你的问题更具体一点。我不确定您会发现哪些结果出乎意料。
  • "我尝试命名对象参数,但该函数失去了将丢失的键解析为其默认值的能力。...这是 ES6 规范的一部分吗?有没有办法实现所需在函数体中没有附加代码的行为?”我不是在询问实现此功能的最实用方法。我问的是结束问题显示的 ES6 规范。
  • 编辑: 我删除了多余的 options = {a: "foo", b: "bar"} 示例,因为它没有为问题添加上下文。 options = {a = "foo", b = "bar"} = {} 有效,但结果出乎意料。我想知道这是否是预期的 ES6 行为。
  • 还不如用ES6 for Object.assign:options = { a: 'foo', b: 'bar', ...options };
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 2017-06-14
  • 2020-02-18
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多