уничтожение объекта, являющегося аргументом функции, с помощью свойства по умолчанию

#javascript #function #object #ecmascript-6

#javascript #функция #объект #ecmascript-6

Вопрос:

Я хочу передать объект в качестве аргумента функции. Если свойство ‘prop’ этого объекта не определено, его следует инициализировать значением по умолчанию.

Как это сделать, используя современный JS?

Я ожидаю чего-то подобного:

 const fun = function(options = { prop: 'default'}) { console.log(options.prop)}


fun({a: 'x', prop: 'hello'}) ... // log: 'hello'

fun({a: 'x'}) ... // log: 'default'
  

Ответ №1:

Если вы хотите выполнить деструкцию в списке параметров, у вас больше не будет доступа ко всему исходному объекту ( options , здесь) — у вас будут только деструктурированные переменные. Итак, опустите options = часть и поставьте = после prop вместо : . Например:

 const fun = function({ prop = 'default', a }) {
  console.log('prop:', prop, 'a:', a);
};

fun({
  a: 'x',
  prop: 'hello'
}) // log: 'hello'

fun({
  a: 'x'
}) // log: 'default'  

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

 const fun = function({ prop = 'default', a } = {}) {
  console.log('prop:', prop, 'a:', a);
};

fun({
  a: 'x',
  prop: 'hello'
}) // log: 'hello'

fun({
  a: 'x'
}) // log: 'default'

fun(); // log: 'default'  

Комментарии:

1. итак, это означает, что у меня больше нет доступа к свойству ‘a’?

2. Вы можете уничтожить столько свойств, сколько хотите, просто добавьте их внутрь {}

3. @CertainPerformance есть ли способ избежать ошибки при null передаче в fun функцию?

4. @TheReason Параметры по умолчанию работают только тогда, когда не передается аргумент или undefined . Если может быть передан неопределенный объект, не являющийся объектом (например, null или какой-либо примитив), то вам придется проверить это вне списка параметров, а затем уничтожить аргумент или объект по умолчанию.

Ответ №2:

Вместо этого используйте этот синтаксис:

 const fun = ({ prop = "default" }) => console.log(prop);
fun({ a: "x", prop: "hello" });
fun({ a: "x" });  

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

 const fun = ({ prop = "default", ...rest }) => {
  console.log(prop);
  const otherProps = { ...rest };
  console.log(JSON.stringify(otherProps));
}
fun({ a: "x", prop: "hello" });
fun({ a: "x" });
fun({ a: "x", b: "nonexistent", c: true, prop: "Hi!" });  

Ответ №3:

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

 const
    fun = function({ prop = 'default', ...options }) { 
        Object.assign(options, { prop });
        console.log(options.prop);
    };

fun({ a: 42 });
fun({ a: 42, prop: 'bar' });  

Ответ №4:

Я думаю, вы должны справиться с этим внутри самой функции. Ниже приведен код, который будет работать для вашего конкретного сценария

 var fun = function(options = { prop:'default'}) {
if(options.prop == undefined){
options.prop = 'default'
}
console.log(options.prop)
}

fun({a:'hello'})// logs: default