JavaScript
Этот раздел - основной учебный маршрут по JavaScript, на котором обычно ломаются даже сильные кандидаты.
Быстрый переход к обучению
Что нужно знать
- Типы и сравнения:
var/let/const,null/undefined, truthy/falsy,==/===,Object.is,NaN. - Область видимости и функции:
lexical scope, hoisting, TDZ,
this, замыкания, prototype chain. - Работа с данными: мутация/иммутабельность, shallow/deep copy, ссылочная идентичность.
- Асинхронность:
Event Loop, microtask/macrotask, Promise combinators,
AbortController, retry/timeout. - Browser runtime:
storage API, CORS, загрузка скриптов (
async/defer/module), memory leaks.
Что уметь объяснить на собеседовании
- Почему
Promise.thenобычно отрабатывает раньшеsetTimeout. - Когда
==допустим и почему===- дефолт. - Почему
constне делает объект полностью immutable. - Как гонки запросов появляются в UI и как их предотвращать в реальных компонентах.
- Где прототипная модель реально влияет на код и производительность.
Грейд-фокус
- Junior: типы, сравнения, функции, массивы/объекты, базовый async.
- Middle: очереди задач, надежные async-паттерны, диагностика багов из прод-логики.
- Senior: архитектура async-flow, resilience-подходы (retry/backoff/cancel), риски масштабирования.
Глубокие кейсы собеседования
- Порядок выполнения async-кода:
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');
Сильный ответ:
A -> D -> C -> B, потому что then идет в microtask queue, а setTimeout в macrotask queue.
-
Иммутабельность и баг в UI: если мутировать вложенный объект в state, сравнение по ссылке не увидит изменение и часть UI не обновится. Нужны иммутабельные обновления и контроль ownership состояния.
-
Гонки запросов: пользователь быстро переключает фильтры, более старый запрос приходит позже и затирает новые данные. Нужны
AbortController, request-id или stale-guard.
Практический минимум
- Реализовать
debounceиthrottleвручную. - Написать функцию безопасного merge без мутации входных данных.
- Разобрать 5 примеров порядка логов с async-кодом.
- Реализовать
fetchс таймаутом и отменой черезAbortController. - Для каждой задачи зафиксировать trade-offs решения и признаки деградации.
Типовые ловушки
- Я знаю event loop, но не могу объяснить очереди.
- Утверждение, что
let/constне hoist-ятся. - Смешение
nullиundefinedбез контракта. - Логика retry без лимитов, что приводит к retry storm.
- Оптимизации без профилирования и метрик.
Self-review перед собеседованием
- Я могу за 30-40 секунд объяснить Event Loop без путаницы.
- Я могу показать практический кейс, где ошибка была из-за мутации.
- Я умею объяснить, как предотвращал race condition в UI.
- Я знаю минимум 2 trade-off для каждого async-подхода, который предлагаю.
Связанные материалы
Архивный монолит
Полный старый материал: JavaScript (архив)