А если без «если»?
В программировании условия («операторы ветвления») являются базовой конструкцией, но зачастую можно не писать в лоб if
, а использовать более подходящие варианты, выразительные и лаконичные.
Пример 1. Возврат булевого значения.
Результат сравнения возвращает булево значение, поэтому можно делать сразу возврат без условий.
if (a === b) {
return true;
}
return false;
return a === b;
Пример 2. Оператор «или».
if (a) {
return a;
}
return defaultValue;
return a || defaultValue;
В данной ситуации следует быть очень осторожным, чётко понимая, с какими значениями происходит работа. Например, мы ожидаем в поле строку, и хотим проверить, не является ли она пустой, и есть ли в этом поле вообще значение. В данной ситуации всё ок. Но мы можем случайно не зайти в ветку, если нам придёт булево false
или 0
. Поэтому лучше (в т. ч. для производительности) явно прописывать условие. Скажем, проверяем наличие значения в объекте, тогда пишем if (a !== undefined) { }
.
Если вы пишете на тайпскрипте (версии 3.7 и выше), то можно использовать nullish coalescing:
if (res.count !== undefined && res.count !== null) {
return res.count;
}
return defaultCount;
return res.count ?? defaultCount;
Пример 3. Тернарный оператор.
Порой лучше написать явный if
, нежели хуже читаемый тернарник (и уж точно никогда не стоит вкладывать один тернарный в другой), но иногда он может быть вполне обоснованным. Допустим, мы создаём переменную, и в зависимости от условия в неё записываем значение, которое не будет меняться. Так избежим использования let
и начального создания переменной со значением undefined
.
let x;
if (someCondition) {
x = 'a';
} else {
x = 'b';
}
const x = someCondition ? 'a' : 'b';
Пример 4. Словарь.
Например, необходимо обработать значение переменной, которое может иметь множество вариантов. Вместо того, чтобы городить батарею из else if
можно построить батарею из case
, а можно использовать объект (или Map), ключами которого будут возможные значения.
if (str === 'a') {
// do smth;
} else if (str === 'b') {
// do smth;
} else if (str === 'c') {
// do smth;
} else if (str === 'd') {
// do smth;
} else if (str === 'e') {
// do smth;
}
const map = {
a: // do smth,
b: // do smth,
c: // do smth,
d: // do smth,
e: // do smth,
};
map(str);
Если необходимо обработать ветку else
можно использовать оператор ||
(см. Пример 2, не забывая про уместность).
...
} else if (str === 'e') {
// do smth;
} else {
// do smth else;
}
...
e: // do smth,
};
map(str) || // do smth else;
Если же у вас есть ситуация, когда выбор происходит на основе комбинации двух и более условий, то это порождает структуру из вложенных if
, причём внутренние условия повторяются. Избежать этого можно при помощи битовой карты.
Пример 5. Встроенные методы языка.
5.1. padStart
Есть у нас некое число, отражающее порядковый номер месяца или дня в месяце. Для вывода даты мы хотим добавлять ноль в некоторых случаях (lead zero).
if (num.toString().length === 1) {
result = `0${num}`;
} else {
result = `${num}`;
}
result = num.toString().padStart(2, '0');
5.2. Math.max()
Использовать в качестве периода значение, не меньше определённого.
const minPeriod = 30;
if (res.period < minPeriod) {
period = minPeriod;
} else {
period = res.period;
}
const minPeriod = 30;
period = Math.max(res.period, minPeriod);
5.?. Ну вы поняли
Меньше императивности, больше декларативности.
{{ 'Comments (%count%)' | trans {count:count} }}
{{ 'Comments are closed.' | trans }}