Вопросы на собеседовании: Frontend (React)
Реальные вопросы с фронтенд-собеседований: от event loop и замыканий до реконсиляции React, хуков и лишних ререндеров.
Курс «Вопросы на собеседовании: Frontend (React)» состоит из 5 разделов и 15 уроков: JavaScript под капотом, React: рендеринг, Хуки и их ловушки, Состояние и данные и Браузер, вёрстка, сеть. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 JavaScript под капотом
- Event loop: что выведет код
Порядок вывода setTimeout, Promise и синхронного кода. Макро- и микрозадачи, почему setTimeout(0) не значит «сразу». Разбор классического вопроса с собеседования.
- Замыкания и цикл
Почему var в цикле с setTimeout печатает 3, 3, 3, как это чинит let, что именно захватывает замыкание и зачем это нужно на практике — включая stale closure в React.
- this, call/apply/bind и стрелки
Чему равен this при разных способах вызова, почему у стрелочной функции нет своего this и как теряется контекст при передаче метода в колбэк. Разбор с живым кодом.
- Event loop: что выведет код
2 React: рендеринг
- Реконсиляция и Virtual DOM
Что такое Virtual DOM и реконсиляция в React, как React сравнивает деревья элементов и почему смена типа элемента размонтирует всё поддерево вместе с состоянием.
- Зачем нужен key (и почему не индекс)
Почему key={index} в React ломает списки: разбор бага с полями ввода при удалении элемента из середины, как key влияет на переиспользование состояния и когда индекс допустим.
- Почему компонент лишний раз рендерится
Лишние ререндеры в React: ререндер родителя тянет детей, новая ссылка на объект или функцию ломает memo, ререндер не равен обновлению DOM — и как всё это диагностировать.
- Реконсиляция и Virtual DOM
3 Хуки и их ловушки
- useState: батчинг и функциональное обновление
Почему два setCount(count + 1) подряд увеличивают счётчик на 1, а не на 2: батчинг, состояние как снимок и функциональное обновление setCount(prev => prev + 1).
- useEffect: зависимости и очистка
useEffect на собеседовании: массив зависимостей и что будет без него, бесконечный цикл эффекта, функция очистки, гонка запросов и двойной вызов в StrictMode.
- useMemo, useCallback и React.memo
Зачем useCallback, если у ребёнка нет React.memo? Разбираем, что реально делают useMemo, useCallback и memo, когда они бесполезны и во что обходится мемоизация.
- useState: батчинг и функциональное обновление
4 Состояние и данные
- Подъём состояния и prop drilling
Где хранить состояние в React, что такое prop drilling, как Context решает проблему и почему за него приходится платить ререндером всех потребителей.
- Контролируемые и неконтролируемые компоненты
Почему input с value без onChange не даёт печатать, чем контролируемая форма отличается от формы на ref, когда что выбирать и как React управляет значением поля.
- Загрузка данных и гонки запросов
Классический баг useEffect + fetch: медленный ответ перезаписывает свежий. Разбираем гонку запросов, отмену через AbortController и зачем нужны библиотеки данных.
- Подъём состояния и prop drilling
5 Браузер, вёрстка, сеть
- CSS: специфичность, flex и позиционирование
Разбор классических вопросов по CSS на собеседовании: каскад и специфичность селекторов, flex против grid, почему position: absolute ломает вёрстку, box-sizing.
- HTTP, CORS и кеширование
Собеседование по сети: коды ответов HTTP, что такое CORS и почему ошибка видна фронтенду, а чинится на бэкенде, preflight-запрос OPTIONS, ETag и заголовки кеширования.
- Оптимизация фронтенда на собеседовании
Как отвечать на вопрос о производительности фронтенда: измерения и Web Vitals, размер бандла и code splitting, ленивая загрузка, виртуализация списков, изображения.
- CSS: специфичность, flex и позиционирование