RecallDeck

Направление

Подготовка к собеседованию — Frontend-разработчик

Колода из 121+ карточек с вопросами для собеседования по направлению «Frontend-разработчик» — по темам и уровню сложности, с возвратом ровно перед тем, как вы забудете. Посмотрите несколько карточек ниже, затем войдите, чтобы учить всё направление по расписанию в стиле Anki (SM-2).

121 карточка9 тем

Бесплатно · вход через GitHub · ваш прогресс остаётся с вами.

Что внутри

Все темы направления, сгруппированные так, как вы будете их учить.

Behavioral

35 карточек
Behavioral

HTML & CSS

12 карточек
Html Css

JavaScript

14 карточек
Javascript

TypeScript

10 карточек
Typescript

React & Frameworks

14 карточек
React

Browser & Performance

10 карточек
Performance

Accessibility

8 карточек
Accessibility

Tooling, Build & Testing

10 карточек
Tooling

Frontend System Design

8 карточек
System Design

Примеры вопросов

Несколько карточек из колоды — откройте ответ, затем войдите, чтобы учить весь набор по расписанию.

Что такое семантическая вёрстка и зачем она нужна (доступность, SEO, поддержка)?

Короткий ответ: Семантическая вёрстка — это использование HTML-тегов по их смыслу (<nav>, <article>, <button>), а не <div> на всё подряд. Браузер и вспомогательные технологии понимают структуру документа, что даёт доступность, SEO и читаемый код.

Подробно:

  1. Доступность (a11y) — скринридеры строят дерево доступности по тегам: <nav>, <main>, <h1> дают навигацию по ориентирам и заголовкам. <div>-суп озвучивается как бесструктурный текст.
  2. SEO — поисковики выделяют <article>, <h1><h6>, <time> как сигналы структуры и важности контента.
  3. Поддерживаемость<header>/<footer>/<aside> самодокументируют разметку; не нужно читать классы, чтобы понять роль блока.
  4. Бесплатное поведение<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 меняет расчёт размеров.

Короткий ответ: Каждый элемент — это вложенные слои: content → padding → border → margin. По умолчанию (content-box) width задаёт только контент, а padding и border прибавляются сверху. border-box включает padding и border внутрь заданной width.

Подробно:

  1. content — область контента, на которую и ссылается width/height при content-box.
  2. padding — внутренний отступ, окрашивается фоном элемента.
  3. border — рамка между padding и margin.
  4. 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 идут в строку по содержимому и игнорируют width/вертикальные margin; inline-block — в строке, но с управляемыми размерами. Нормальный поток — порядок, в котором элементы раскладываются сверху вниз (block) и слева направо (inline) без позиционирования.

Подробно:

  1. block (<div>, <p>, <section>) — новая строка, ширина по умолчанию 100%, уважает width/height, все margin/padding.
  2. inline (<span>, <a>, <strong>) — в потоке текста; width/height и вертикальные margin игнорируются, горизонтальные — работают.
  3. inline-block — в строке, как inline, но с полноценными размерами и отступами — классика для «кнопок» в ряд.
  4. Нормальный поток — раскладка по умолчанию; 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 поднимается и инициализируется как undefined (функциональная область видимости), а let/const поднимаются, но остаются в TDZ (temporal dead zone) до строки объявления и имеют блочную область видимости.

Подробно:

  1. var — функциональная область видимости, доступна как undefined до объявления, можно переобъявлять.
  2. let — блочная область видимости, в TDZ до объявления, переприсваивание разрешено.
  3. const — как let, но без переприсваивания (само значение объекта при этом мутабельно).
  4. 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 и типичные ловушки.

Короткий ответ: === сравнивает без приведения типов (строгое равенство), == сначала приводит операнды к общему типу (нестрогое). Из-за непредсказуемости приведений в коде почти всегда используют ===. Восемь значений считаются falsy, остальные — truthy.

Подробно:

  1. === — равны, только если совпадают и тип, и значение.
  2. == — приводит типы по сложным правилам (число ↔ строка, к примитиву и т.д.).
  3. 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 ![]false0, []''0

⚠️ Частая ошибка: проверять if (x == null) и удивляться. Это как раз корректный приём — ловит и null, и undefined. А вот == с числами и строками — источник багов; берите ===.

Зачем нужен TypeScript поверх JavaScript и что такое структурная (утиная) типизация?

Короткий ответ: TypeScript добавляет статическую проверку типов поверх JS: ошибки ловятся в редакторе и на этапе сборки, а не в рантайме. Типизация в нём структурная — совместимость определяется формой объекта (набором полей), а не именем типа или явным implements.

Подробно:

  1. Что даёт TS — автодополнение и навигация, безопасный рефакторинг, самодокументируемые контракты, отлов опечаток и undefined до запуска.
  2. Структурная vs номинальная — в Java/C# типы совместимы по имени (номинальная типизация). В TS — если объект имеет нужные поля, он подходит, даже если создан без знания о целевом типе.
  3. Стирание типов — типы существуют только при компиляции, в рантайме это обычный 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 и т.п.) — компилятор верит вашим аннотациям на слово.

Готовы закрепить навсегда?

Первая сессия — меньше минуты. Ваше будущее «я» на собеседовании скажет спасибо.

Другие направления

RecallDeckПодготовка к собеседованию на интервальных повторениях