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