我正在使用默认参数,使用此功能:
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
如何确保将可选属性设置为默认值?
答案 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);
}