Объект как функция param в Javascript - PullRequest
0 голосов
/ 10 марта 2019

Как я могу установить объект как параметр функции со значениями по умолчанию

Пример:

function objasparam({obj1: {var1: 0, var2: "something"}, obj2: {...}}) {
   console.log(obj1.var1); //the expacted log is 0 but it is undefined
}
objasparam({
   obj1:{
     var2: "other"
   }
});

, даже если я делаю это таким образом, появляется ошибка

function objasparam(obj = {obj1: {var1: 0, var2: "something"}, obj2: {...}}) {
   console.log(obj.obj1.var1); //the expacted log is 0 but it is undefined
}
objasparam({
   obj1:{
     var2: "other"
   }
});

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Есть два уровня по умолчанию:

  1. По умолчанию свойства объекта при его разрушении,

  2. Предоставление значения по умолчанию для объекта в целом.

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

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;
}
0 голосов
/ 10 марта 2019

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

const objasparam = (config) => {
  let defaults = {
    obj1: {
      var1: 0,
      var2: "something"
    },
    obj2: {
      var1: 1
    }
  }

  config = {
    ...defaults,
    ...config
  }

  // to get your obj1.var1
  console.log(config.obj1.var1);
  
  // complete config
  console.log(config);
}

objasparam();
objasparam({
  obj1: { var1: 22, var2: "another string"}
});
.as-console-wrapper { max-height: 100% !important }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...