#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