2

我使用默认参数,使用此功能:解构默认属性

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

同时使用'test'和'done'两次完全不同的对象的属性名称会引起混淆。我甚至无法分辨你是故意还是混淆了自己。哪些投入的预期产出是多少? – Bergi

回答

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

否则,你将需要扁平化你的论点。

如果使用通天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; 
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); 
}