Урок 05

Условия

if / else

if (age >= 18) {
    console.log('Взрослый');
} else {
    console.log('Ребёнок');
}

else if

if (score >= 90) {
    grade = 'A';
} else if (score >= 80) {
    grade = 'B';
} else if (score >= 70) {
    grade = 'C';
} else {
    grade = 'F';
}

Тернарный оператор

const status = isActive ? 'активен' : 'неактивен';

Для простых условий:

const greeting = name ? `Привет, ${name}` : 'Привет';

switch

switch (day) {
    case 'monday':
    case 'tuesday':
        console.log('Работа');
        break;
    case 'saturday':
    case 'sunday':
        console.log('Отдых');
        break;
    default:
        console.log('Неизвестно');
}

Важно: без break выполнение «проваливается» в следующий case.

switch (1) {
    case 1: console.log('один');
    case 2: console.log('два');
    default: console.log('default');
}
// один
// два
// default

Иногда это нужно (группировка случаев), но чаще — баг.

switch с true

Позволяет писать условия как в if:

switch (true) {
    case score >= 90:
        grade = 'A';
        break;
    case score >= 80:
        grade = 'B';
        break;
    default:
        grade = 'F';
}

Но обычно if/else понятнее.

Истинность

Условие приводится к boolean:

if (0) {}         // не выполнится
if ('') {}        // не выполнится
if ([]) {}        // выполнится
if ({}) {}        // выполнится
if ('false') {}   // выполнится

Falsy: false, 0, -0, '', null, undefined, NaN.

Проверка на существование

if (value) {
    // value truthy: не 0, не '', не null, не undefined
}

if (value !== null && value !== undefined) {
    // только на null и undefined
}

if (value != null) {
    // короче, но включает 0 и ''
}

Опциональная цепочка

if (user?.address?.city) {
    console.log(user.address.city);
}

Логические операторы

&& для проверки

if (user && user.isAdmin) {
    //
}

// Короче через ?.
if (user?.isAdmin) {
    //
}

|| для значений по умолчанию

const name = input || 'Гость';

?? для значений по умолчанию

const count = input ?? 0; // 0 и '' не перезаписываются

Объект-маппинг вместо switch

const messages = {
    success: 'Готово',
    error: 'Ошибка',
    loading: 'Загрузка',
};

console.log(messages[status] ?? 'Неизвестно');

Читается лучше длинного switch.

Итоги

  • if/else — база
  • Тернарник — для простых случаев
  • switch — для множества вариантов
  • Falsy-значения важны
  • ?? для значений по умолчанию
  • Объект-маппинг вместо switch