解构和设置嵌套的默认值

时间:2017-08-29 21:36:51

标签: javascript ecmascript-6 destructuring

我正在旋转我的脑袋一段时间,但似乎我无法按照我希望的方式完成这项工作。实际上,我想要的是为可选参数设置嵌套的默认值。 我想看到的输出应该是:

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
  }
});

有人可以就这个问题向我提问吗?

node app.js // webserver
node app.js worker // worker

2 个答案:

答案 0 :(得分:5)

您正在为{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);
}

答案 1 :(得分:0)

如果参数为空,则仅分配默认参数。我认为你需要在函数体中使用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
  }
});