解构默认属性
问题描述:
我使用默认参数,使用此功能:解构默认属性
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
如何确保可选属性设置为其默认值?
答
您不能提供嵌套的默认参数。在你的例子中,如果你提供了测试,那么它将不会被分配给你通过属性值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)
}
否则,你将需要扁平化你的论点。
如果使用通天transpile这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;
答
没有供选择在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);
}
同时使用'test'和'done'两次完全不同的对象的属性名称会引起混淆。我甚至无法分辨你是故意还是混淆了自己。哪些投入的预期产出是多少? – Bergi