Собеседование на джуна Frontend: 50 вопросов с разбором
Я провожу собеседования джунов на фронт пять лет, в среднем 6–8 интервью в неделю. За это время вопросы кочуют от компании к компании, повторяются, и собрать список типовых — задача решаемая. Ниже 50 вопросов, которые реально звучат на джун-фронте в 2026, с краткими разборами.
Это не «учи и копируй ответ». Это карта тем. Если по любому пункту тебе нечего сказать своими словами — там и нужно докопаться.
JavaScript — 15 вопросов
- Чем var, let и const отличаются? Скоуп (function vs block), hoisting, возможность переопределения. const запрещает переприсваивание ссылки, но не мутацию объекта.
- Что такое hoisting? Объявления переменных и функций «поднимаются» в начало скоупа. var объявляется, но инициализируется undefined; let/const попадают в TDZ.
- == vs ===. Первое сравнение с приведением типов, второе строгое. Используй ===, кроме осознанных кейсов вроде
x == null. - this в стрелочной и обычной функции. Стрелочная не имеет своего this, наследует из enclosing scope. Обычная — определяется в момент вызова.
- Замыкание. Функция плюс окружение, в котором она была создана. Классический пример: счётчик через IIFE.
- Event loop простыми словами. Стек вызовов, очередь макротасков (setTimeout, события), микротасков (Promise.then, queueMicrotask). Микротаски выполняются между макротасками.
- Что выведет код?
setTimeout(() => console.log(1), 0); Promise.resolve().then(() => console.log(2)); console.log(3);Ответ: 3, 2, 1. - Promise состояния. pending, fulfilled, rejected. Промис не отменяемый штатно, для отмены — AbortController.
- async/await — что это? Сахар над промисами. async-функция всегда возвращает промис, await ждёт его разрешения.
- Чем отличается
mapотforEach? map возвращает новый массив, forEach — undefined и нужен только для side effects. - Что такое spread/rest? Один синтаксис, разные роли: «...» в литерале — распаковка, в параметрах функции — сбор остатка.
- Глубокое и поверхностное копирование. Object.assign и spread — поверхностное. Для глубокого — structuredClone (в браузерах с 2022) или recursive clone.
- Symbol — зачем? Уникальные ключи свойств, не сталкиваются с другими. Используются в well-known symbols (Symbol.iterator).
- Map vs Object. Map хранит порядок, ключи любого типа, у него нет prototype-цепочки, лучше для частых добавлений/удалений.
- WeakMap — когда нужен? Когда не хочешь, чтобы сборщик мусора держал ключи. Например, метаданные DOM-элементов.
Браузер и DOM — 8 вопросов
- Как браузер строит страницу? HTML → DOM, CSS → CSSOM, объединение в render tree, layout, paint, composite.
- Reflow vs repaint. Reflow — пересчёт геометрии, дорогой. Repaint — перерисовка без изменения размеров.
- Event delegation. Слушать события на родителе и определять цель через event.target.
- Capture vs bubble. Фаза погружения вниз и фаза всплытия вверх по DOM. addEventListener третьим параметром { capture: true }.
- preventDefault и stopPropagation. Первое отменяет дефолт (отправку формы), второе останавливает распространение по DOM.
- localStorage vs sessionStorage vs cookies. Объёмы, время жизни, отправляются ли в HTTP-запросах. localStorage не отправляется, cookies отправляются.
- CORS простыми словами. Браузер запрещает кросс-доменные запросы без CORS-заголовков от сервера. preflight OPTIONS на не простые запросы.
- Что такое viewport-мета?
<meta name="viewport" content="width=device-width, initial-scale=1">. Без этого мобильные страницы рендерятся в десктопной ширине.
HTML и доступность — 5 вопросов
- Семантические теги — зачем? Скринридеры, SEO, читаемость.
<header>, <nav>, <article>вместо<div>. - Где использовать h1? Один h1 на страницу, основной заголовок. Дальше h2/h3 в иерархии.
- alt у картинок. Описание изображения для screen readers. Декоративные картинки — alt="".
- aria-label vs label. label — связан с input через for/id, читается всеми. aria-label — для случаев, когда видимого лейбла нет.
- Контраст текста. WCAG AA: 4.5:1 для основного текста, 3:1 для крупного. Проверка в DevTools.
CSS — 10 вопросов
- Specificity (специфичность). Считается как четыре числа: inline, id, class/attr/pseudo, tag. Победитель — больший вес.
- Box model. content, padding, border, margin. box-sizing: border-box включает padding и border в width.
- Flexbox: основные оси. main и cross. justify-content по main, align-items по cross.
- Grid vs Flex. Grid — двумерная раскладка, Flex — одна ось. Используй Grid для макета страниц, Flex для компонентов.
- Что такое CSS-переменные?
--color: red;иcolor: var(--color). В отличие от препроцессоров — работают в рантайме и каскадируются. - position: absolute vs fixed. absolute — относительно ближайшего позиционированного предка, fixed — относительно viewport.
- z-index когда не работает? Когда у элемента нет position (не static), либо когда родитель создаёт stacking context.
- Как работает медиа-запрос? @media с условием, применяется при совпадении. Mobile-first: писать стили для маленьких экранов, потом расширять через min-width.
- Что делает will-change? Подсказка браузеру, что свойство будет анимироваться, чтобы вынести на отдельный composite-слой. Не злоупотребляй.
- Почему margin схлопывается? Vertical margin collapse — у соседних блок-элементов вертикальные отступы сливаются в максимальный.
React — 12 вопросов
- Что такое JSX? Синтаксический сахар над
React.createElement. Транспилируется в вызовы функции. - Виртуальный DOM зачем? Объект в памяти, который сравнивается со старым (reconciliation), и в реальный DOM применяются только различия.
- Хуки — правила. Только на верхнем уровне функции, только в компонентах и кастомных хуках. Никогда — внутри условий и циклов.
- useState и асинхронность. Сеттер не сразу обновляет state. Чтение после set в той же функции вернёт старое значение.
- useEffect: dependency array. Пустой [] — выполнится один раз при монтировании. Без массива — на каждый рендер. С зависимостями — когда они меняются.
- useMemo и useCallback — когда нужны? Когда есть реальная проблема производительности или когда передаёшь зависимости в другие хуки/мемоизированные компоненты. Не на каждой переменной.
- useRef — для чего? Хранение мутабельного значения без перерендера. Доступ к DOM-узлам.
- Reconciliation и key. React сравнивает виртуальный DOM поэлементно. key помогает понять, что список переупорядочился, а не пересоздался. Не используй индекс массива в качестве key, если список меняется.
- Контролируемые и неконтролируемые компоненты. Controlled — значение в state, читаешь через value/onChange. Uncontrolled — внутреннее состояние DOM, доступ через ref.
- Что такое context? Способ пробросить данные глубоко без props drilling. Не замена state-менеджера для часто меняющихся данных — будут лишние рендеры.
- Server Components в 2026. Часть рендера выполняется на сервере, на клиент уходит только результат. Уменьшают bundle, но требуют понимания границ «server» / «client».
- Suspense + lazy. Динамическая загрузка компонента + fallback в дереве. Часть code splitting.
Как готовиться
Не зубри ответы. Я с первого вопроса вижу, когда человек выучил формулировку. Возьми пять-шесть основных тем, поковыряй в коде. Открой консоль, попиши промисы, попробуй сломать reconciliation криво поставленным key. Объясни кому-нибудь словами, как работает event loop. Если можешь объяснить — знаешь.
На реальном собеседовании тебя ещё попросят написать что-то простое: debounce, типизировать какой-нибудь generic, разобрать тонкость в useEffect. Это обычно встроено в обсуждение, не отдельным «алгоритмическим раундом» (для джуна-фронта алгоритмы редкость).
И последнее. Если не знаешь ответа — лучше скажи «не знаю, могу порассуждать». Любой нормальный интервьюер ценит это сильно выше, чем уверенный неверный ответ. Я лично не беру кандидатов, которые «знают всё».