Interview track

Frontend Developer interview prep

A spaced-repetition deck of 262+ Frontend Developer interview questions — organised by topic and difficulty, and scheduled for review based on your ratings. Preview a few cards below, then choose access to study the whole track on an Anki-style SM-2 schedule.

262 cards12 topics
See access options

Eligible new monthly or yearly subscribers get 7 days free. Checkout confirms eligibility and charges.

Before you start

Start with basic HTML/CSS and JavaScript and experience building a small browser interface. React and TypeScript examples assume you can read component code.

First pass: HTML & CSS → JavaScript. Begin with the foundational questions in these modules, then follow the outline. Revisit advanced and senior questions as the job requires; all cards remain available from the start.

Shared topics can appear in several tracks and keep one review history. The outline labels shared foundations and role-specific modules; choose your depth for the job you are preparing for.

What's covered

Every topic in this track, grouped the way you'd study it.

HTML & CSS

19 cards

Role-specific module

HTML & CSS

JavaScript

33 cards

Role-specific module

JavaScript

TypeScript

18 cards

Role-specific module

TypeScript

React & Frameworks

30 cards

Role-specific module

React

Browser & Performance

17 cards

Role-specific module

Performance

Accessibility

12 cards

Role-specific module

Accessibility

Web Security

8 cards

Role-specific module

Web Security

Tooling, Build & Testing

12 cards

Role-specific module

Tooling & Testing

DevOps & Infra

9 cards

Shared foundations

Git

Frontend System Design

13 cards

Role-specific module

System Design

CS Fundamentals

53 cards

Shared foundations

Data Structures & Algorithms

Behavioral

38 cards

Shared foundations

Behavioral

Sample questions

A few cards from the deck — reveal each answer, then choose access to study the full set on a schedule.

What is semantic HTML and why does it matter (accessibility, SEO, maintainability)?

Short answer: Semantic HTML means using tags for their meaning (<nav>, <article>, <button>) instead of <div> for everything. Browsers and assistive tech understand the document structure, which buys you accessibility, SEO, and readable code.

In depth:

  1. Accessibility (a11y) — screen readers build the accessibility tree from tags: <nav>, <main>, <h1> enable landmark and heading navigation. Div soup is announced as unstructured text.
  2. SEO — search engines treat <article>, <h1>–<h6>, <time> as structure and content-importance signals.
  3. Maintainability — <header>/<footer>/<aside> self-document the markup; you don't read class names to learn a block's role.
  4. Free behavior — <button> is focusable and reacts to Enter/Space, <a> navigates, <details> toggles — no JS required.
<!-- ❌ div soup -->
<div class="nav"><div class="link" onclick="go()">Home</div></div>

<!-- ✅ semantic -->
<header>
  <nav aria-label="Primary">
    <a href="/">Home</a>
  </nav>
</header>
<main>
  <article>
    <h1>Article title</h1>
    <time datetime="2026-06-30">June 30, 2026</time>
  </article>
</main>

⚠️ Common mistake: making a clickable <div onclick> instead of a <button> — you lose focus, keyboard handling, and the screen-reader role.

What is hoisting, and how do var, let, and const differ in scope and TDZ?

Short answer: Hoisting is moving declarations to the top of their scope at compile time. var is hoisted and initialized to undefined (function scope), while let/const are hoisted but stay in the TDZ (temporal dead zone) until the declaration line and have block scope.

In depth:

  1. var — function scope, readable as undefined before declaration, re-declarable.
  2. let — block scope, in the TDZ until declaration, reassignment allowed.
  3. const — like let but no reassignment (the object's value itself is still mutable).
  4. TDZ — accessing a let/const before declaration throws ReferenceError instead of returning undefined.
console.log(a); // undefined — var hoisted
var a = 1;

console.log(b); // ReferenceError — b in TDZ
let b = 2;
Scope Before declaration Reassign
var function undefined yes
let block TDZ → error yes
const block TDZ → error no

⚠️ Common mistake: believing let/const "aren't hoisted." They are — but accessing them before initialization throws because of the TDZ.

Why use TypeScript over JavaScript, and what is structural (duck) typing?

Short answer: TypeScript adds static type checking on top of JS: errors are caught in the editor and at build time instead of at runtime. Its typing is structural — compatibility is decided by an object's shape (its set of fields), not by the type's name or an explicit implements.

In depth:

  1. What TS buys you — autocompletion and navigation, safe refactoring, self-documenting contracts, catching typos and undefined before running.
  2. Structural vs nominal — in Java/C# types match by name (nominal typing). In TS, if an object has the required fields it fits, even if it was created with no knowledge of the target type.
  3. Type erasure — types exist only at compile time; at runtime it is plain JS. You can't instanceof-check an interface.
interface Point { x: number; y: number }

function len(p: Point): number {
  return Math.hypot(p.x, p.y);
}

// the object never declared implements Point, but its shape fits
const v = { x: 3, y: 4, label: "v" };
len(v); // OK — structural typing: the extra label field is fine

⚠️ Common mistake: assuming TS protects you at runtime. Data from an API must be validated (zod, etc.) — the compiler takes your annotations on faith.

What is JSX and what does it compile to?

Short answer: JSX is syntactic sugar over element-creation calls. A compiler (Babel/SWC) turns it into jsx-runtime calls (or React.createElement in the classic transform) that return plain JS objects describing the UI — not real DOM nodes.

In depth:

  1. It's an expression, not HTML — JSX compiles to JavaScript and can go anywhere an expression is allowed.
  2. The new JSX transform (React 17+) — imports jsx/jsxs from react/jsx-runtime, so you no longer need import React just for JSX.
  3. It returns an element object — shaped like { type, key, props }; real DOM appears only on render.
  4. Case matters — a capitalized tag is a component, a lowercase one is a DOM element.
const el = <button className="btn" onClick={fn}>Save</button>;
// the new transform compiles this to:
import { jsx } from "react/jsx-runtime";
const el = jsx("button", { className: "btn", onClick: fn, children: "Save" });

⚠️ Common mistake: treating JSX as a string or HTML. It's JS: you write className, not class, and attributes are camelCase (onClick, tabIndex).

How do cookies, localStorage, sessionStorage, and IndexedDB differ, and what should you store where?

Short answer: Cookies are small (about 4 KB each), and the browser sends them automatically with matching HTTP requests; the server can make a cookie HttpOnly (invisible to JS), Secure, and SameSite and set its lifetime — which is why they're used for sessions. localStorage is about 5 MB per origin, lives until cleared, is shared by all tabs of the origin, and has a synchronous strings-only API. sessionStorage is the same but per tab: it survives a reload and disappears when the tab closes. IndexedDB is an asynchronous database for large structured data (objects, Blobs), available in workers too.

In depth:

Cookie localStorage sessionStorage IndexedDB
Lifetime Expires/Max-Age or session until cleared until the tab closes until cleared
Size ~4 KB per cookie ~5 MB ~5 MB quota-based, large
Sent to server yes, automatically no no no
Scope domain + path origin, all tabs origin, one tab origin
API headers / document.cookie synchronous, strings synchronous, strings asynchronous, objects
  1. Tokens — any XSS script can read localStorage; a session is safer in an HttpOnly; Secure; SameSite cookie.
  2. Syncing tabs — the storage event fires in other tabs of the same origin.
  3. Not a guarantee — the browser may evict data under storage pressure, and Safari deletes a site's script-written storage after 7 days without user interaction.
localStorage.setItem("prefs", JSON.stringify({ theme: "dark" })); // strings only
const prefs = JSON.parse(localStorage.getItem("prefs") ?? "{}");

sessionStorage.setItem("wizardStep", "2");  // this tab, survives a reload

window.addEventListener("storage", (e) => { // fires in OTHER tabs
  if (e.key === "prefs") applyPrefs(e.newValue);
});
// The session cookie is set by the server and invisible to JS:
// Set-Cookie: sid=…; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600

⚠️ Common mistake: storing an object directly: localStorage.setItem("u", { a: 1 }) saves the string "[object Object]". Serialize with JSON.stringify.

What is accessibility (a11y) and why does it matter?

Short answer: Accessibility (a11y) means designing products so people with visual, hearing, motor, and cognitive disabilities can use them. It matters for three reasons: ethical (people), business (wider audience), and legal (WCAG, ADA, the European Accessibility Act).

In depth:

  1. People — about 15% of the population lives with some disability; temporary (a broken arm) and situational (bright sun, a noisy train) limitations affect everyone.
  2. Business — more users, better SEO (semantics = clear structure), fewer drop-offs.
  3. Law — WCAG 2.x is the de-facto standard; the US has ADA/Section 508, the EU has the EAA; lawsuits over inaccessible sites are real.
Disability Barrier Solution
Vision can't see the screen screen reader, contrast, alt
Hearing can't hear audio captions, transcripts
Motor can't use a mouse keyboard accessibility
Cognitive complex UI plain language, clear structure

⚠️ Common mistake: treating accessibility as a 'feature for a minority' — in reality it improves UX for everyone (the curb-cut effect).

Ready to make it stick?

Explore a sample, choose a track, and build a review routine that fits your preparation.

Questions about this track

How should I prepare for a Frontend Developer interview?

Study the concepts you'll be asked to explain, not just the ones you can code. RecallDeck's Frontend Developer track gives you 262+ curated interview questions and resurfaces each one with an Anki-style SM-2 schedule based on your ratings — to practise recalling and explaining them. Combine reviews with coding and mock interviews.

What topics does the Frontend Developer track cover?

The Frontend Developer track is organised into the core areas Frontend Developer interviews actually test, grouped by topic and by difficulty (Concept, Junior, Middle, Senior). You can preview the full outline and sample questions above before signing in.

Is spaced repetition effective for Frontend Developer interview prep?

Yes. Active recall and spaced practice can help retain what you study. Grade yourself honestly and check your understanding with practical work. RecallDeck schedules each Frontend Developer card using your ratings, so familiar cards return less often and difficult ones get more practice.

Can I try the Frontend Developer track before paying?

Eligible new monthly or yearly subscribers can try the complete Frontend Developer track and every feature for 7 days. Checkout confirms trial eligibility and the amount due; returning subscribers may be charged immediately. Cancel online before the trial ends to avoid its first charge. Lifetime access has no trial.

Other interview tracks