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

Использование '' '' '' '' '' '' '' '' '' '' '' имена свойств совершенно разных объектов ' Я даже не могу сказать, что вы сделали это специально или смутили себя. Каков ожидаемый результат, для каких входов? – Bergi

ответ

1

Вы не можете предоставить вложенные аргументы по умолчанию. В вашем примере, если вы поставляете тест, он не будет назначен объекту по умолчанию, который вы предоставили с тестом значений свойств и выполнен.

Значения по умолчанию поставляются только в том случае, если функция не передана или не определена: 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); 
} 
Смежные вопросы