解构默认属性

时间:2016-03-07 15:57:17

标签: javascript ecmascript-6 default-parameters destructuring

我正在使用默认参数,使用此功能:

function defaultstest({ test = { done: false, test: true }, done = false } = {}) {
 console.log(test, done)
}

如果我将其称为defaultstest()defaultstest({})defaultstest({ done: true }),则默认设置正确。

但是当我向测试对象添加属性时,其他属性不会设置为默认属性。

defaultstest({ test: { done: true } }) >> { done: true } false

如何确保将可选属性设置为默认值?

2 个答案:

答案 0 :(得分:1)

您无法提供嵌套的默认参数。在您的示例中,如果您提供测试,则不会将其分配给您提供的属性值test和done的默认对象。

仅当未向函数传递值或未定义时才提供默认值:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters

您可以使用Object.assign(ES6)或扩展函数来完成此任务:

function defaultstest(test = {}, done = false ) {
  test = Object.assign({done: false, test: true}, test); 
  console.log(test, done)
}

否则你需要压扁你的论点。

如果您使用babel将其转换为ES5代码,则可能会更清楚:

function defaultstest() {
  var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];

  var _ref$test = _ref.test;
  var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
  var _ref$done = _ref.done;
  var done = _ref$done === undefined ? false : _ref$done;

  console.log(test, done);
}

具体来说,请注意测试和完成的作业:

var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
var done = _ref$done === undefined ? false : _ref$done;

答案 1 :(得分:0)

ES6 / ES2015中没有嵌套默认参数的选项。看看下面编译的源代码。

function defaultstest() {
  var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];

  var _ref$test = _ref.test;
  var test = _ref$test === undefined ? { done: false, test: true } : _ref$test;
  var _ref$done = _ref.done;
  var done = _ref$done === undefined ? false : _ref$done;

  console.log(test, done);
}