Есть два уровня по умолчанию:
По умолчанию свойства объекта при его разрушении,
Предоставление значения по умолчанию для объекта в целом.
Первый - по умолчанию, второй - по умолчанию. Пример, вероятно, лучший способ показать это. Я сделаю один с одним параметром, чтобы сделать его простым, но вы также можете сделать это с несколькими параметрами:
function objasparam(
// Parameter default ------------vvvv
{prop1 = 0, prop2 = "something"} = {}
// ----^^^--------^^^^^^^^^^^^^---- destructuring defaults
) {
console.log(`prop1 = ${prop1}, prop2 = ${prop2}`);
}
console.log("Calling the function with no parameter at all:");
objasparam();
console.log("Calling it with {prop1: 42}:");
objasparam({prop1: 42});
console.log("Calling it with {prop2: 'answer'}:");
objasparam({prop2: 'answer'});
console.log("Calling it with {prop1: 42, prop2: 'answer'}:");
objasparam({prop1: 42, prop2: 'answer'});
/* Make the console take up the whole result pane */
.as-console-wrapper {
max-height: 100% !important;
}
Конечно, если вы хотите, чтобы объект передавался, оставьте параметр default.
function objasparam(
{prop1 = 0, prop2 = "something"}
// ----^^^--------^^^^^^^^^^^^^---- destructuring defaults
) {
console.log(`prop1 = ${prop1}, prop2 = ${prop2}`);
}
try {
console.log("Calling the function with no parameter at all:");
objasparam(); // Fails because an object is expected
} catch (error) {
console.error(error);
}
console.log("Calling it with {prop1: 42}:");
objasparam({prop1: 42});
console.log("Calling it with {prop2: 'answer'}:");
objasparam({prop2: 'answer'});
console.log("Calling it with {prop1: 42, prop2: 'answer'}:");
objasparam({prop1: 42, prop2: 'answer'});
/* Make the console take up the whole result pane */
.as-console-wrapper {
max-height: 100% !important;
}
Или, если вы хотите указать значения по умолчанию только для случая, когда объект вообще не задан, а не если это так, пропустите значения по умолчанию для деструктуризации:
function objasparam(
// Parameter default ------------vvvv
{prop1, prop2} = {prop1: 0, prop2: "something"}
) {
console.log(`prop1 = ${prop1}, prop2 = ${prop2}`);
}
console.log("Calling the function with no parameter at all:");
objasparam();
console.log("Calling it with {prop1: 42}:");
objasparam({prop1: 42});
console.log("Calling it with {prop2: 'answer'}:");
objasparam({prop2: 'answer'});
console.log("Calling it with {prop1: 42, prop2: 'answer'}:");
objasparam({prop1: 42, prop2: 'answer'});
/* Make the console take up the whole result pane */
.as-console-wrapper {
max-height: 100% !important;
}
Наконец: это может быть вложенным, так как деструктуризация позволяет вкладывать. Перечитывая ваш вопрос, мне интересно, пытались ли вы это сделать:
function objasparam(
{ // vvvv--- default for if the object has no `obj1`
obj1: {prop1 = 0, prop2 = "something"} = {},
obj2: {prop3 = "three", prop4 = "four"} = {}
{ // ^^^^--- default for if the object has no `obj2`
} = {} // <=== parameter default if nothing is passed
) {
console.log(`prop1 = ${prop1}`);
console.log(`prop2 = ${prop2}`);
console.log(`prop3 = ${prop3}`);
console.log(`prop4 = ${prop4}`);
}
console.log("Calling the function with no parameter at all:");
objasparam();
console.log("Calling it with {obj1: {prop1: 42}}:");
objasparam({obj1: {prop1: 42}});
console.log("Calling it with {obj2: {prop4: 'quattro'}}:");
objasparam({obj2: {prop4: 'quattro'}});
console.log("Calling it with {obj1: {prop1: 42}, obj2: {prop4: 'quattro'}}:");
objasparam({obj1: {prop1: 42}, obj2: {prop4: 'quattro'}});
/* Make the console take up the whole result pane */
.as-console-wrapper {
max-height: 100% !important;
}