【问题标题】:Capturing nested levels in JavaScript destructuring [duplicate]在 JavaScript 解构中捕获嵌套级别 [重复]
【发布时间】:2019-07-22 16:29:27
【问题描述】:

JavaScript 解构是否具有捕获对象及其内容的语法?

也就是说,如果没有下面的const 行,我可以在函数的 arg 列表中完全执行以下操作吗?

f = (a) => {
  const {b} = a;
  console.log("I see:", a, "and", b);
}

f({b:42})

==> I see {b: 42} and 42

(FWIW:我正在考虑像 Clojure 或 ClojureScript 中的 :as)。

【问题讨论】:

  • 不在参数列表中,不 - 您在正文中的解决方案很好。在声明中你可以做const outer = a, {b} = a;,在嵌套解构中你可以做const {outer, outer: {b}} = {outer: a};

标签: javascript destructuring


【解决方案1】:

是的,你可以

const f = (a, {b} = a ) => {
  console.log("I see:", a, "and", b);
}

f({b:42})

更多destructuring assignment的用例你可以看这个

附注:-在函数定义中比函数调用多保留一个参数。

更新这样你就不用担心函数定义中多了一个参数

const f = (...z) => (a=z[0],{b}=z[0],...arguments) => {
  console.log("I see:", a, "and", b, z);
}

f({b:42},{b:32})()

你也可以试试 IIFE 的 @bergi 感谢您的意见。

const f = (a, ...z) => (({b}) => {
  console.log("I see:", a, "and", b, z);
})(a);

f({b:42},{b:32})

【讨论】:

  • 很酷的技巧,但如果你(错误地)将某些东西作为第二个参数传递给函数,一切都会中断。在函数体中使用解构更安全。
  • @marzelin 当你打算做这样的事情时,意味着你总是知道你在做什么?不是吗?
  • @CodeManiac 从我的角度来看,这样做只是自找麻烦。不幸的是,人们犯了错误。
  • -1,这不是逗号运算符。它是多个参数之间的分隔符,绝对不能在这里使用。
  • @CodeManiac 如果您选择 IIFE 作为 let 表达式的填充,我会这样做:jsfiddle.net/meusvptn :-)
【解决方案2】:

这是一种方式

const f = (a, {b}=a) => {
  console.log("I see:", a, "and", b);
}

f({b:42})

当您需要传递多个参数时,就会出现问题。

const f = (a, {b}=a) => {
  console.log("I see:", a, "and", b);
}

f({b:42},123)

【讨论】:

  • -1,这不是逗号运算符。它是多个参数之间的分隔符,此处绝对不能使用。
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
相关资源
最近更新 更多