【问题标题】:Destructuring and setting nested default values解构和设置嵌套的默认值
【发布时间】:2026-01-31 11:05:02
【问题描述】:

我在这个问题上转了一会儿,但似乎我无法按照我想要的方式完成这项工作。实际上,我在这里想要的只是为可选参数提供嵌套的默认值。 我希望看到的输出应该是:

55, 44, { sub1: '0', sub2: 55, sub3: 'all'}

相反,我得到了这个:

55, 44, { sub2: 55 }

有人能告诉我这个吗?

function foo({ param1=55, param2=44, param3:param3 = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } } = { }) {
  console.log(param1, param2, param3);
}

foo({
  param3: {
    sub2: 55
  }
});

【问题讨论】:

  • 只有在没有传入参数的情况下才会应用默认值吗?我很确定它不会运行类似Object.assign
  • 如果你只是跳过param3,整个默认对象就会发挥作用。老实说,我不知道您是否甚至可以使用这样的嵌套默认值,找不到太多关于它的信息。

标签: javascript ecmascript-6 destructuring


【解决方案1】:

您将{sub2: 55} 传递给param3,因此它不会评估默认值{ sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' }(这里是文字,而不是赋值目标,所以无论如何都不会按照您的想法去做)。

如果您希望 param3 始终是一个具有 3 个属性的对象,由三个默认值变量构造而成,您必须自己显式构建它:

function foo({param1=55, param2=44, param3: {sub1='0', sub2=200, sub3='all'} = {}} = {}) {
  var param3 = {sub1, sub2, sub3};
  console.log(param1, param2, param3);
}

【讨论】:

  • 换句话说,没有办法为嵌套的解构参数创建默认值?
  • @jAndy 不确定你的意思。您可以任意嵌套参数解构,并在每个级别上放置默认值。你不能做的是解构变异参数或创建新对象,其部分由默认值组成。
  • 那么,如果你在这个例子中传递param3,它总是会覆盖整个对象对吧?我想知道的一点是,如果您可以再次在传递的对象中创建默认值(它基本上与外部相同,只是嵌套)。但似乎你已经给出了这个问题的答案。反正我也想拥有这个功能。
  • @jAndy 是的,如果有一个值,它将被分配给目标并且不评估默认初始化程序。目标是另一个解构,还是一个变量,并不重要。更多解释见here
【解决方案2】:

只有当参数为空时才会分配默认参数。我认为你需要在函数体中使用Object.assign

const defaults = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' }
function foo({ param1=55, param2=44, param3 } = { }) {
  const myParam3 = Object.assign({}, defaults, param3);
  console.log(param1, param2, myParam3);
}

foo({
  param3: {
    sub2: 55
  }
});

【讨论】:

  • 您不需要param3:param3 = defaults,只需param3 就足够了。然后你也可以在Object.assign调用中内联defaults,并与第一个对象字面量合并。