Функциональное программирование: чистые функции, каррирование, иммутабельность
↑ 2.1 JavaScript: продвинутый · ← Предыдущая · → Следующая
Зачем это на собесе
Принципы ФП лежат в основе Vue/React (компоненты, редьюсеры, композиция); спрашивают чистоту и каррирование.
Объяснение
| Понятие | Смысл |
|---|---|
| Чистая функция | результат зависит только от аргументов, без побочных эффектов |
| Побочный эффект | изменение внешнего состояния, I/O, Date.now(), Math.random(), DOM |
| Иммутабельность | не изменять данные, а создавать новые |
| Функции высшего порядка | принимают/возвращают функции (map, filter, reduce) |
| Композиция | compose(f, g)(x) = f(g(x)), pipe слева направо |
| Каррирование | f(a, b, c) → f(a)(b)(c) |
| Частичное применение | фиксация части аргументов (bind) |
| Декларативность | описываем «что», а не «как» |
const add = (a) => (b) => a + b; // каррирование
const add5 = add(5);
const pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
const slugify = pipe(s => s.trim(), s => s.toLowerCase(), s => s.replace(/\s+/g, "-"));
const curry = (fn) => function c(...a) { return a.length >= fn.length ? fn(...a) : (...b) => c(...a, ...b); };
// Иммутабельные обновления
const next = { ...state, user: { ...state.user, name: "B" } };
const list2 = [...list.slice(0, i), item, ...list.slice(i + 1)];
const list3 = list.toSpliced(i, 1); // без мутацииПлюсы: предсказуемость, тестируемость, лёгкая мемоизация, безопасность параллелизма. Минусы: копирования (структурное разделение и библиотеки Immer уменьшают стоимость), порог вхождения.
Во Vue/Pinia: состояние мутируется реактивно (Proxy), но вычисления (computed, селекторы) должны быть чистыми, а watch/onMounted — местом для эффектов.
Нюансы и подводные камни
- «Чистая» функция, принимающая объект и меняющая его, не чистая.
Array.prototype.sort/reverseмутируют: копируйте перед вызовом илиtoSorted.- Глубокое копирование дорого: используйте структурное разделение.
- Избыточная композиция ухудшает читаемость.
Практика
- Реализуйте
compose,pipe,curry,partial. - Перепишите мутирующий код на чистые функции.
- Сделайте иммутабельное обновление вложенного состояния через Immer.
Вопросы с ответами
Что такое чистая функция?
Функция, возвращающая один и тот же результат для одинаковых аргументов и не имеющая побочных эффектов.
Зачем иммутабельность?
Предсказуемость, простая проверка изменений (сравнение ссылок), отладка и безопасность.