Функция, которая принимает объект с необязательными свойствами/свойствами по умолчанию в качестве параметра?

Я понимаю, что с использованием синтаксиса ES6 можно создать функцию, которая принимает объект в качестве параметра, и этот параметр может иметь значение по умолчанию, например:

function exampleFunction(objParam = {val1: 1, val2: 2}) {
    //...
}

Если я вызываю exampleFunction(), objParam получает значение по умолчанию. Однако, если я позвоню exampleFunction({val1: 3}), objParam.val2 будет undefined. Это имеет смысл, потому что значение по умолчанию не применяется. Есть ли способ убедиться, что objParam.val2 действительно имеет значение, используя нотацию ES6? Я знаю, что могу добавить проверки внутри функции, но это вносит несогласованность в код, а я бы этого не хотел.

Изменить: чтобы уточнить, вот лучший пример:

function exampleFunction(param = 0, objParam = {val1: 1, val2: 2}) {
    return objParam.val1;
}
exampleFunction(); // Returns 1 (this is good)
exampleFunction(1, {val1: 2}); // Returns 2 (this is good)
exampleFunction(1, {val2: 3}); // Returns undefined (I want it to return 1)

И вот что у меня сейчас есть, что работает, но несколько неэлегантно:

function exampleFunction(param = 0, objParam = {val1: 1, val2: 2}) {
    if(objParam.val1 === undefined) objParam.val1 = 1
    if(objParam.val2 === undefined) objParam.val2 = 2
    ...
}

person Ian    schedule 08.05.2018    source источник
comment
Нет, это не совсем возможно. Значение по умолчанию для параметра — это просто значение по умолчанию. Он не обрабатывает свойства слияния переданных объектов. Вы должны сделать это самостоятельно, используя Object.assign   -  person VLAZ    schedule 08.05.2018


Ответы (2)


Вы можете использовать деструктурирование в параметрах, чтобы обеспечить ценности:

function exampleFunction({val1 = 1, val2 = 2} = {}) {
  console.log(val1, val2);
}
exampleFunction({val1: 5});
exampleFunction();

Если вы хотите сохранить параметр как объект, вы можете использовать Object.assign:

function exampleFunction(origParams = {}) {
  const objParam = Object.assign({ val1: 1, val2: 2 }, origParams);
  console.log(objParam.val1, objParam.val2);
}
exampleFunction({val1: 5});
exampleFunction();

person Michał Perłakowski    schedule 08.05.2018
comment
+1 к вопросу @ElAoutarHamza, и я также хотел бы увидеть способ сохранить параметр как объект, если это возможно. Например, вместо того, чтобы обращаться к нему как val1, обращайтесь к нему как param.val1. - person Ian; 08.05.2018
comment
@Ian После моего редактирования он также обрабатывает неопределенные значения. Если вы хотите сохранить параметр как объект, вы должны использовать Object.assign или синтаксис распространения объекта, как в ответе Сэма. - person Michał Perłakowski; 08.05.2018
comment
В этой статье simonsmith.io/ более подробно рассматривается . - person nevf; 08.05.2019

Вероятно, не так чисто, как вы ищете, но вы можете сделать это вместо этого.

function exampleFunction(objParams) {
  const defParams = { val1: 1, val2: 2 };

  const finalParams = { ...defParams, ...objParams }
  // final params takes the default params and overwrites any common properties with incoming params

  // ...
}
person Sam    schedule 08.05.2018
comment
Это работает для меня, и это чище, чем принятый ответ IMO - person akmalhakimi1991; 11.04.2020