【问题标题】:Destructure object parameter, but also have reference to the parameter as an object? [duplicate]解构对象参数,还要把参数当作对象引用? [复制]
【发布时间】:2018-08-11 00:25:27
【问题描述】:

使用 ES6,您可以在函数参数中解构对象:

({name, value}) => { console.log(name, value) }

等效的 ES5 将是:

function(params) { console.log(params.name, params.value) }

但是,如果我想同时引用params 对象和嵌套属性valuename,该怎么办?这是我得到的最接近的,但缺点是它不适用于箭头函数,因为它们无法访问 arguments 对象:

function({name, value}) {
  const params = arguments[0]
  console.log(params, name, value)
}

【问题讨论】:

  • function(params){const {name,value}=params;console.log(params,name,value)}?
  • @ProfessorAllman 是的,非常接近。还有一个赋值行,所以我想我的问题是:是否可以在函数签名中做到这一点,比如function({name,value}=params)
  • 不,它只会使核心难以阅读并且特别是当您开始使用箭头函数时会感到困惑。没有真正的好处。
  • @DayanMorenoLeon 我同意,只是好奇

标签: javascript ecmascript-6 destructuring object-destructuring


【解决方案1】:

arguments 在箭头函数中不可用,这会影响 ES6 中函数参数的一致处理方式。

如果使用原始参数,应该在函数内部进行解构:

(param) => {
  const {name, value} = param;
  // ...
}

如果需要多个参数并且发生一些参数协商(例如,类似于arguments.length),则应使用 rest 参数:

(...args) => {
  const [param] = args;
  // ...
}

样板变量解构有它的好处;通过这种方式在断点处调试 paramargs 会更容易,即使它们当前没有被使用。

【讨论】:

  • 谢谢,我认为答案很好地总结了惯用用法与可用选项
  • 当然,不客气。我自己使用这种风格作为经验法则,因为参数解构看起来很整洁,但是在箭头回调中调试对我来说是一个问题。
【解决方案2】:

接下来呢:

function({name, value}, params=arguments[0]) {
    console.log(params, name, value)
}

或者:

function(params, {name, value} = params) {
    console.log(params, name, value)
}

【讨论】:

  • 这不适用于箭头函数。
  • @Ele 已更新,现在必须工作
  • 我觉得这很令人困惑,因为该函数似乎需要 2 个参数。此外,它适用于单个参数,但在您执行 x({name: 'name', value: 'value'}, {name: 'name2', value: 'value2'}) 时会失败
猜你喜欢
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多