JavaScript: правильный способ задания параметров объекта с именем и значением по умолчанию - PullRequest
3 голосов
/ 17 марта 2019

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

Следующий код без именования параметра работает просто отлично.

function test({
  item1,
  item2 = 0
}) {
  console.log(item1 + " " + item2);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj.item1 + " " + obj.item2);
}

Но если я сейчас начну устанавливать obj = {...} для перехода на print(), я получаю синтаксическую ошибку:

function test(obj = {
  item1,
  item2 = 0
}) {
  print(obj);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj.item1 + " " + obj.item2);
}

Если я напишу item2: 0, ошибки не будет, но тогда в print item2 не определено.


Из приведенных ниже ответов мне кажется, что это лучший способ для меня:

function test(obj) {
  obj = Object.assign({
    item1: undefined,
    item2: 0
  }, obj);
  print(obj);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj.item1 + " " + obj.item2);
}

Ответы [ 2 ]

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

Разрушение извлекает свойства из объекта, переданного функции, и помещает эти свойства в автономные переменные - и все. То, что вы пытаетесь сделать, это изменить один из параметров , а не извлечь свойства из параметра в отдельные переменные .

Вы не можете изменять параметры в списке параметров - для той логики, которую вы ищете, вам придется делать это внутри тела функции test:

function test(obj) {
  if (!obj.hasOwnProperty('item2')) {
    obj.item2 = 0;
  }
  print(obj);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj.item1 + " " + obj.item2);
}

Если у вас есть множество свойств, которым вы хотите присвоить значения по умолчанию, вы можете использовать Object.assign:

function test(obj) {
  const filledObj = Object.assign({
    item2: 0,
    item3: 'item3'
  }, obj);
  print(filledObj);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj);
}

Если вы хотите, чтобы объект с определенными свойствами передавался в print, извлеките эти свойства из списка параметров, как вы это делали изначально, а затем передайте восстановленный объект только с этими свойствами в print:

function test({
  item1,
  item2 = 0
}) {
  const obj = { item1, item2 };
  print(obj);
}

test({
  item1: "foo"
});

function print(obj) {
  console.log(obj.item1 + " " + obj.item2);
}
0 голосов
/ 17 марта 2019

= недопустимо для присвоения значений в javascript, вы ищете {key: value}.

Измените = на :, чтобы исправить ошибку:

// You want to destructure you object, drop the `obj =`
function test({item1,item2 = 0}) {
  // If you were to modify this data, 
  // use `Object.assign({}, {item1,item2})` to prevent mutating your data
  print({item1,item2});
  
}

// save some space by destructuring the items you want
function print({item1, item2}) {
  console.log(`${item1} ${item2}`);
}

// Initial expected result
test({item1: "foo"});

Разрушение объекта по сравнению со значениями по умолчанию

Я предполагаю, что вы ожидаете, что значение item2 будет равно 0 правильно? Он не равен 0, потому что вы передаете новый объект, который переопределяет объект в параметрах вашей функции.

Точно так же, как если бы вы установили:

function(a = 1){}

и передать значение, a больше не будет равно 1, поскольку оно было заменено новым значением.

Причина, по которой вы получаете ожидаемое поведение в своем первом фрагменте кода (без obj = {...}), заключается в том, что вы уничтожаете объект. Это не задание, скорее вы извлекаете нужные части из объекта.

Когда у вас есть функция с такими аргументами, как:

function({arg1, arg2}){}

JavaScript извлечет эти ключи из объекта, который вы передаете.

Назначение значений по умолчанию

Если, с другой стороны, если вы хотите передать объект без разрушения, вы можете сделать это так:

function(obj = {a: 'default'}){}

Но, если вы передадите объект в функции выше, значение по умолчанию для объекта и всех его ключей (a или любых других) будет заменено на любой объект, который вы передаете. Здесь ссылка на работу параметров по умолчанию в javascript .

Я настоятельно рекомендую вам разобраться с деструктуризацией, это невероятно полезно при работе с объектами или массивами в javascript.

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...