Перейти к основному содержимому

JavaScript

Этот раздел - основной учебный маршрут по JavaScript, на котором обычно ломаются даже сильные кандидаты.

Быстрый переход к обучению

  1. JavaScript — учебный модуль
  2. Все учебные модули

Что нужно знать

  1. Типы и сравнения: var/let/const, null/undefined, truthy/falsy, ==/===, Object.is, NaN.
  2. Область видимости и функции: lexical scope, hoisting, TDZ, this, замыкания, prototype chain.
  3. Работа с данными: мутация/иммутабельность, shallow/deep copy, ссылочная идентичность.
  4. Асинхронность: Event Loop, microtask/macrotask, Promise combinators, AbortController, retry/timeout.
  5. Browser runtime: storage API, CORS, загрузка скриптов (async/defer/module), memory leaks.

Что уметь объяснить на собеседовании

  1. Почему Promise.then обычно отрабатывает раньше setTimeout.
  2. Когда == допустим и почему === - дефолт.
  3. Почему const не делает объект полностью immutable.
  4. Как гонки запросов появляются в UI и как их предотвращать в реальных компонентах.
  5. Где прототипная модель реально влияет на код и производительность.

Грейд-фокус

  1. Junior: типы, сравнения, функции, массивы/объекты, базовый async.
  2. Middle: очереди задач, надежные async-паттерны, диагностика багов из прод-логики.
  3. Senior: архитектура async-flow, resilience-подходы (retry/backoff/cancel), риски масштабирования.

Глубокие кейсы собеседования

  1. Порядок выполнения 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.

  1. Иммутабельность и баг в UI: если мутировать вложенный объект в state, сравнение по ссылке не увидит изменение и часть UI не обновится. Нужны иммутабельные обновления и контроль ownership состояния.

  2. Гонки запросов: пользователь быстро переключает фильтры, более старый запрос приходит позже и затирает новые данные. Нужны AbortController, request-id или stale-guard.

Практический минимум

  1. Реализовать debounce и throttle вручную.
  2. Написать функцию безопасного merge без мутации входных данных.
  3. Разобрать 5 примеров порядка логов с async-кодом.
  4. Реализовать fetch с таймаутом и отменой через AbortController.
  5. Для каждой задачи зафиксировать trade-offs решения и признаки деградации.

Типовые ловушки

  1. Я знаю event loop, но не могу объяснить очереди.
  2. Утверждение, что let/const не hoist-ятся.
  3. Смешение null и undefined без контракта.
  4. Логика retry без лимитов, что приводит к retry storm.
  5. Оптимизации без профилирования и метрик.

Self-review перед собеседованием

  1. Я могу за 30-40 секунд объяснить Event Loop без путаницы.
  2. Я могу показать практический кейс, где ошибка была из-за мутации.
  3. Я умею объяснить, как предотвращал race condition в UI.
  4. Я знаю минимум 2 trade-off для каждого async-подхода, который предлагаю.

Связанные материалы

  1. Junior JavaScript
  2. Middle JavaScript и React
  3. Senior Frontend
  4. Песочница

Архивный монолит

Полный старый материал: JavaScript (архив)