В трекере посылок каждый статус заказа — отдельное состояние с своим текстом и иконкой: "принят", "собирается", "в пути", "доставлен", "возврат". Писать цепочку if/else для 6 вариантов некрасиво — switch делает такой код намного читаемее.
switch решает ту же задачу что и if/else, но лучше читается когда нужно сравнить одну переменную с несколькими конкретными значениями.
Когда у тебя 5+ вариантов значения одной переменной, цепочка if/else выглядит громоздко:
// Многословно с if/else:
if (status === 'pending') return 'Ожидает'
else if (status === 'processing') return 'В работе'
else if (status === 'shipped') return 'Отправлен'
else if (status === 'delivered') return 'Доставлен'
else return 'Неизвестно'
// Читаемо с switch:
switch (status) {
case 'pending': return 'Ожидает'
case 'processing': return 'В работе'
case 'shipped': return 'Отправлен'
case 'delivered': return 'Доставлен'
default: return 'Неизвестно'
}switch (выражение) {
case значение1:
// код
break // обязателен!
case значение2:
// код
break
default:
// выполнится если ни один case не подошёл
}Сравнение строгое: switch использует === (тип + значение).
Без break выполнение "проваливается" в следующий case (fall-through):
switch (2) {
case 1:
console.log('один')
case 2:
console.log('два') // выполнится
case 3:
console.log('три') // тоже выполнится! — не было break
default:
console.log('default') // и это тоже!
}Иногда fall-through используют специально:
switch (dayOfWeek) {
case 'Суббота':
case 'Воскресенье':
return 'Выходной' // оба дня — одинаковое действие
case 'Пятница':
return 'Короткий день'
default:
return 'Рабочий день'
}switch лучше когда:
if/else лучше когда:
score > 80)a && b || c)Ошибка 1: Забыть break — "проваливание"
switch (role) {
case 'admin':
grantAdminAccess()
// забыли break!
case 'user':
grantUserAccess() // выполнится и для admin — баг!
}
// Правильно: break после каждого caseОшибка 2: Сравнивать диапазоны в switch
// Так не работает:
switch (score) {
case score >= 90: return 'Отлично' // всегда false!
}
// Для диапазонов используй if/elseОшибка 3: Объявить переменную в case без блока
switch (action) {
case 'add':
const item = 'товар' // SyntaxError в некоторых средах
break
case 'remove':
const item = 'другой' // ошибка: item уже объявлен
}
// Правильно: оборачивать case с let/const в блок {}
switch (action) {
case 'add': {
const item = 'товар'
break
}
}switch используется для обработки статусов из API, определения действий в Redux reducer, разбора типов событий, маршрутизации команд. В Redux reducers switch — стандартный паттерн.
Трекер посылок: статусы заказа и уведомления
function getOrderStatus(status) {
switch (status) {
case 'created':
return { label: 'Создан', description: 'Ожидает подтверждения магазина' }
case 'confirmed':
return { label: 'Подтверждён', description: 'Магазин принял заказ' }
case 'assembling':
return { label: 'Собирается', description: 'Готовим к отправке' }
case 'shipped':
return { label: 'В пути', description: 'Передан в службу доставки' }
case 'delivered':
return { label: 'Доставлен', description: 'Успешно получен' }
case 'cancelled':
case 'rejected':
return { label: 'Отменён', description: 'Заказ не будет доставлен' }
default:
return { label: 'Неизвестно', description: 'Статус не определён' }
}
}
// Тест с разными статусами
const statuses = ['created', 'shipped', 'delivered', 'cancelled', 'unknown']
for (const s of statuses) {
const { label, description } = getOrderStatus(s)
console.log(`${s}: ${label} — ${description}`)
}
// created: Создан — Ожидает подтверждения магазина
// shipped: В пути — Передан в службу доставки
// delivered: Доставлен — Успешно получен
// cancelled: Отменён — Заказ не будет доставлен
// unknown: Неизвестно — Статус не определёнВ трекере посылок каждый статус заказа — отдельное состояние с своим текстом и иконкой: "принят", "собирается", "в пути", "доставлен", "возврат". Писать цепочку if/else для 6 вариантов некрасиво — switch делает такой код намного читаемее.
switch решает ту же задачу что и if/else, но лучше читается когда нужно сравнить одну переменную с несколькими конкретными значениями.
Когда у тебя 5+ вариантов значения одной переменной, цепочка if/else выглядит громоздко:
// Многословно с if/else:
if (status === 'pending') return 'Ожидает'
else if (status === 'processing') return 'В работе'
else if (status === 'shipped') return 'Отправлен'
else if (status === 'delivered') return 'Доставлен'
else return 'Неизвестно'
// Читаемо с switch:
switch (status) {
case 'pending': return 'Ожидает'
case 'processing': return 'В работе'
case 'shipped': return 'Отправлен'
case 'delivered': return 'Доставлен'
default: return 'Неизвестно'
}switch (выражение) {
case значение1:
// код
break // обязателен!
case значение2:
// код
break
default:
// выполнится если ни один case не подошёл
}Сравнение строгое: switch использует === (тип + значение).
Без break выполнение "проваливается" в следующий case (fall-through):
switch (2) {
case 1:
console.log('один')
case 2:
console.log('два') // выполнится
case 3:
console.log('три') // тоже выполнится! — не было break
default:
console.log('default') // и это тоже!
}Иногда fall-through используют специально:
switch (dayOfWeek) {
case 'Суббота':
case 'Воскресенье':
return 'Выходной' // оба дня — одинаковое действие
case 'Пятница':
return 'Короткий день'
default:
return 'Рабочий день'
}switch лучше когда:
if/else лучше когда:
score > 80)a && b || c)Ошибка 1: Забыть break — "проваливание"
switch (role) {
case 'admin':
grantAdminAccess()
// забыли break!
case 'user':
grantUserAccess() // выполнится и для admin — баг!
}
// Правильно: break после каждого caseОшибка 2: Сравнивать диапазоны в switch
// Так не работает:
switch (score) {
case score >= 90: return 'Отлично' // всегда false!
}
// Для диапазонов используй if/elseОшибка 3: Объявить переменную в case без блока
switch (action) {
case 'add':
const item = 'товар' // SyntaxError в некоторых средах
break
case 'remove':
const item = 'другой' // ошибка: item уже объявлен
}
// Правильно: оборачивать case с let/const в блок {}
switch (action) {
case 'add': {
const item = 'товар'
break
}
}switch используется для обработки статусов из API, определения действий в Redux reducer, разбора типов событий, маршрутизации команд. В Redux reducers switch — стандартный паттерн.
Трекер посылок: статусы заказа и уведомления
function getOrderStatus(status) {
switch (status) {
case 'created':
return { label: 'Создан', description: 'Ожидает подтверждения магазина' }
case 'confirmed':
return { label: 'Подтверждён', description: 'Магазин принял заказ' }
case 'assembling':
return { label: 'Собирается', description: 'Готовим к отправке' }
case 'shipped':
return { label: 'В пути', description: 'Передан в службу доставки' }
case 'delivered':
return { label: 'Доставлен', description: 'Успешно получен' }
case 'cancelled':
case 'rejected':
return { label: 'Отменён', description: 'Заказ не будет доставлен' }
default:
return { label: 'Неизвестно', description: 'Статус не определён' }
}
}
// Тест с разными статусами
const statuses = ['created', 'shipped', 'delivered', 'cancelled', 'unknown']
for (const s of statuses) {
const { label, description } = getOrderStatus(s)
console.log(`${s}: ${label} — ${description}`)
}
// created: Создан — Ожидает подтверждения магазина
// shipped: В пути — Передан в службу доставки
// delivered: Доставлен — Успешно получен
// cancelled: Отменён — Заказ не будет доставлен
// unknown: Неизвестно — Статус не определёнТы разрабатываешь систему уведомлений для приложения. Функция getNotificationIcon принимает тип уведомления и возвращает эмодзи иконку: "message" — письмо, "like" — сердце, "follow" — человек, "mention" — собачка, "system" и "error" — колокол, всё остальное — точка.
switch (type) { case "like": return "heart" }. Для группировки двух case: напиши их один за другим без break между ними