Направление
Подготовка к собеседованию — Frontend-разработчик
Колода из 121+ карточек с вопросами для собеседования по направлению «Frontend-разработчик» — по темам и уровню сложности, с возвратом ровно перед тем, как вы забудете. Посмотрите несколько карточек ниже, затем войдите, чтобы учить всё направление по расписанию в стиле Anki (SM-2).
Бесплатно · вход через GitHub · ваш прогресс остаётся с вами.
Что внутри
Все темы направления, сгруппированные так, как вы будете их учить.
Behavioral
35 карточекHTML & CSS
12 карточекJavaScript
14 карточекTypeScript
10 карточекReact & Frameworks
14 карточекBrowser & Performance
10 карточекAccessibility
8 карточекTooling, Build & Testing
10 карточекFrontend System Design
8 карточекПримеры вопросов
Несколько карточек из колоды — откройте ответ, затем войдите, чтобы учить весь набор по расписанию.
Что такое семантическая вёрстка и зачем она нужна (доступность, SEO, поддержка)?
Что такое семантическая вёрстка и зачем она нужна (доступность, SEO, поддержка)?
Короткий ответ: Семантическая вёрстка — это использование HTML-тегов по их смыслу (<nav>, <article>, <button>), а не <div> на всё подряд. Браузер и вспомогательные технологии понимают структуру документа, что даёт доступность, SEO и читаемый код.
Подробно:
- Доступность (a11y) — скринридеры строят дерево доступности по тегам:
<nav>,<main>,<h1>дают навигацию по ориентирам и заголовкам.<div>-суп озвучивается как бесструктурный текст. - SEO — поисковики выделяют
<article>,<h1>–<h6>,<time>как сигналы структуры и важности контента. - Поддерживаемость —
<header>/<footer>/<aside>самодокументируют разметку; не нужно читать классы, чтобы понять роль блока. - Бесплатное поведение —
<button>фокусируется и реагирует на Enter/Space,<a>навигируется,<details>сворачивается — без JS.
<!-- ❌ div-суп -->
<div class="nav"><div class="link" onclick="go()">Главная</div></div>
<!-- ✅ семантика -->
<header>
<nav aria-label="Основная">
<a href="/">Главная</a>
</nav>
</header>
<main>
<article>
<h1>Заголовок статьи</h1>
<time datetime="2026-06-30">30 июня 2026</time>
</article>
</main>
⚠️ Частая ошибка: делать кликабельный <div onclick> вместо <button> — теряются фокус, клавиатура и роль для скринридера.
Объясните блочную модель CSS и как box-sizing: border-box меняет расчёт размеров.
Объясните блочную модель CSS и как box-sizing: border-box меняет расчёт размеров.
Короткий ответ: Каждый элемент — это вложенные слои: content → padding → border → margin. По умолчанию (content-box) width задаёт только контент, а padding и border прибавляются сверху. border-box включает padding и border внутрь заданной width.
Подробно:
- content — область контента, на которую и ссылается
width/heightприcontent-box. - padding — внутренний отступ, окрашивается фоном элемента.
- border — рамка между padding и margin.
- margin — внешний отступ, прозрачный; у соседних блоков по вертикали схлопывается (margin collapse).
┌──────────── margin ────────────┐
│ ┌───────── border ─────────┐ │
│ │ ┌────── padding ─────┐ │ │
│ │ │ content │ │ │
│ │ └────────────────────┘ │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
/* content-box: реальная ширина = 200 + 2*16 + 2*2 = 236px */
.a { box-sizing: content-box; width: 200px; padding: 16px; border: 2px solid; }
/* border-box: реальная ширина ровно 200px, padding/border внутри */
.b { box-sizing: border-box; width: 200px; padding: 16px; border: 2px solid; }
/* типичный сброс */
*, *::before, *::after { box-sizing: border-box; }
⚠️ Частая ошибка: задать width: 100% плюс padding на content-box — блок вылезает за контейнер; border-box это чинит.
В чём разница между block, inline и inline-block, и что такое нормальный поток документа?
В чём разница между block, inline и inline-block, и что такое нормальный поток документа?
Короткий ответ: Block-элементы занимают всю ширину строки и принимают любые размеры/отступы; inline идут в строку по содержимому и игнорируют width/вертикальные margin; inline-block — в строке, но с управляемыми размерами. Нормальный поток — порядок, в котором элементы раскладываются сверху вниз (block) и слева направо (inline) без позиционирования.
Подробно:
- block (
<div>,<p>,<section>) — новая строка, ширина по умолчанию 100%, уважаетwidth/height, все margin/padding. - inline (
<span>,<a>,<strong>) — в потоке текста;width/heightи вертикальные margin игнорируются, горизонтальные — работают. - inline-block — в строке, как inline, но с полноценными размерами и отступами — классика для «кнопок» в ряд.
- Нормальный поток — раскладка по умолчанию;
position,float, flex/grid выводят из него.
| display | Перенос строки | width/height | Верт. margin |
|---|---|---|---|
| block | да | да | да |
| inline | нет | нет | нет |
| inline-block | нет | да | да |
.tag { display: inline-block; width: 80px; padding: 4px 8px; }
⚠️ Частая ошибка: задавать width/height на чистом inline-элементе и ждать эффекта — их там не существует; нужен inline-block или block.
Что такое хойстинг и чем отличаются var, let и const с точки зрения области видимости и TDZ?
Что такое хойстинг и чем отличаются var, let и const с точки зрения области видимости и TDZ?
Короткий ответ: Хойстинг — это подъём объявлений в начало их области видимости на этапе компиляции. var поднимается и инициализируется как undefined (функциональная область видимости), а let/const поднимаются, но остаются в TDZ (temporal dead zone) до строки объявления и имеют блочную область видимости.
Подробно:
- var — функциональная область видимости, доступна как
undefinedдо объявления, можно переобъявлять. - let — блочная область видимости, в TDZ до объявления, переприсваивание разрешено.
- const — как
let, но без переприсваивания (само значение объекта при этом мутабельно). - TDZ — обращение к
let/constдо объявления бросаетReferenceError, а не возвращаетundefined.
console.log(a); // undefined — var поднят
var a = 1;
console.log(b); // ReferenceError — b в TDZ
let b = 2;
| Область видимости | До объявления | Переприсваивание | |
|---|---|---|---|
| var | функция | undefined |
да |
| let | блок | TDZ → ошибка | да |
| const | блок | TDZ → ошибка | нет |
⚠️ Частая ошибка: считать, что let/const «не поднимаются». Они поднимаются — но обращение к ним до инициализации падает из-за TDZ.
В чём разница между == и ===? Объясните приведение типов, truthy/falsy и типичные ловушки.
В чём разница между == и ===? Объясните приведение типов, truthy/falsy и типичные ловушки.
Короткий ответ: === сравнивает без приведения типов (строгое равенство), == сначала приводит операнды к общему типу (нестрогое). Из-за непредсказуемости приведений в коде почти всегда используют ===. Восемь значений считаются falsy, остальные — truthy.
Подробно:
- === — равны, только если совпадают и тип, и значение.
- == — приводит типы по сложным правилам (число ↔ строка, к примитиву и т.д.).
- Falsy — ровно восемь:
false,0,-0,0n,'',null,undefined,NaN. Всё прочее truthy.
| Выражение | Результат | Почему |
|---|---|---|
0 == '' |
true |
оба → число 0 |
0 == '0' |
true |
'0' → 0 |
null == undefined |
true |
спецправило |
null == 0 |
false |
null равен только undefined |
NaN === NaN |
false |
NaN не равен ничему |
[] == ![] |
true |
![]→false→0, []→''→0 |
⚠️ Частая ошибка: проверять if (x == null) и удивляться. Это как раз корректный приём — ловит и null, и undefined. А вот == с числами и строками — источник багов; берите ===.
Зачем нужен TypeScript поверх JavaScript и что такое структурная (утиная) типизация?
Зачем нужен TypeScript поверх JavaScript и что такое структурная (утиная) типизация?
Короткий ответ: TypeScript добавляет статическую проверку типов поверх JS: ошибки ловятся в редакторе и на этапе сборки, а не в рантайме. Типизация в нём структурная — совместимость определяется формой объекта (набором полей), а не именем типа или явным implements.
Подробно:
- Что даёт TS — автодополнение и навигация, безопасный рефакторинг, самодокументируемые контракты, отлов опечаток и
undefinedдо запуска. - Структурная vs номинальная — в Java/C# типы совместимы по имени (номинальная типизация). В TS — если объект имеет нужные поля, он подходит, даже если создан без знания о целевом типе.
- Стирание типов — типы существуют только при компиляции, в рантайме это обычный JS. Нельзя проверить тип через
instanceofдля интерфейса.
interface Point { x: number; y: number }
function len(p: Point): number {
return Math.hypot(p.x, p.y);
}
// объект не объявлял implements Point, но подходит по форме
const v = { x: 3, y: 4, label: "v" };
len(v); // OK — структурная типизация: лишнее поле label не мешает
⚠️ Частая ошибка: считать, что TS защищает в рантайме. Данные из API нужно валидировать (zod и т.п.) — компилятор верит вашим аннотациям на слово.
Готовы закрепить навсегда?
Первая сессия — меньше минуты. Ваше будущее «я» на собеседовании скажет спасибо.