Функциональное программирование: чистые функции, каррирование, иммутабельность

↑ 2.1 JavaScript: продвинутый · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Принципы ФП лежат в основе 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.
  • Глубокое копирование дорого: используйте структурное разделение.
  • Избыточная композиция ухудшает читаемость.

Практика

  1. Реализуйте compose, pipe, curry, partial.
  2. Перепишите мутирующий код на чистые функции.
  3. Сделайте иммутабельное обновление вложенного состояния через Immer.

Вопросы с ответами

Связанные темы