【问题标题】:arrow functions: destructuring arguments and grabbing them as a whole at the same time箭头函数:解构参数并同时将它们作为一个整体抓取
【发布时间】:2018-04-17 10:58:19
【问题描述】:

我们可以同时解构:({a, b}) => ( a + b ) 并获取参数:(...args) => ( f({...args}) ),同时用于 ES6 中的箭头函数。

寻找类似(...args = {a, b}) => ( a + b + f({...args}) )的东西。

我目前的解决方案是:

({a, b}) => {
  const {...args} = {a, b}
  return a + b + f({...args})
}

但它是多余的 或(感谢 nnnnnn 和 Dmitry)

(args) => {
  const {a, b} = args
  return a + b + f({...args})
}

这样冗余更少,肯定更好,但仍不能完全令人满意。

【问题讨论】:

  • 如果您使用解构参数({a,b}) 定义函数,这是否意味着该函数仅使用一个参数(一个对象)被调用?
  • 不只是({a, b}) => a + b + f(a, b)({a, b}) => a + b + f({a, b})
  • @Slai。在我真正的问题中,我不只有 a 和 b。我有 15 个名称很长的参数。根据条件,我要么使用它们并返回一些东西,要么委托给另一个函数。这些不是位置参数,而是基于键的参数。但你在技术上是正确的。然而没有帮助:(。
  • 那么当您调用另一个函数f() 时,您想将包含所有基于键的参数的原始对象传递给它吗? f() 的签名是什么?
  • 假设它必须是一个箭头函数(因此没有 arguments 对象)我倾向于做 (args) => { const {a,b} = args; return a + b + f(args) } - 有点像你当前的解决方案,除了你只需要列出 { a,b} 部分在一个地方。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

您可以将默认参数和对象休息用于第一个参数的解构赋值目标,其中需要单个对象,并且可以通过解构先前定义的对象参数来选择定义后续参数

const fn = ({...args} = {}, {a, b} = args) => console.log(a, b, args);

【讨论】:

  • 注意= {} 的默认参数,如果未定义ab,则可防止出错
  • fn({a:1, b:2}) 在控制台中打印1 2 {},这意味着args 为空。我希望 args 同时包含 a 和 b。基本上我希望args 成为对fn 的原始函数调用的参数。
  • @AdrianSilvescu 是否将单个对象传递给函数?
  • @AdrianSilvescu const fn = ({...args} = {}, {a, b} = args) => console.log(a, b, args)
  • @AdrianSilvescu 您可以在后续参数中使用先前定义的参数,函数参数有自己的范围。 ab 被定义为不同的变量,并设置为对象 args 中的值,其中包含 ab 属性和传递给函数的对象上设置的其余属性。跨度>
【解决方案2】:

如果您的意思是 f 也接受命名参数,那么为什么不直接使用:

(params) => {
  const { a, b } = params
  return a + b + f(params)
}

【讨论】:

  • 我赞成您的回答,但由于问题中列出的原因,我不会接受它。不过还是谢谢你。 nnnnnn 在 cmets 中也提出了相同的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多