Frontend Developer interview prep
A spaced-repetition deck of 121+ 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.
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
12 cardsRole-specific module
JavaScript
14 cardsRole-specific module
TypeScript
10 cardsRole-specific module
React & Frameworks
14 cardsRole-specific module
Browser & Performance
10 cardsRole-specific module
Accessibility
8 cardsRole-specific module
Tooling, Build & Testing
10 cardsRole-specific module
Frontend System Design
8 cardsRole-specific module
Behavioral
35 cardsShared foundations
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)?
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:
- 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. - SEO — search engines treat
<article>,<h1>–<h6>,<time>as structure and content-importance signals. - Maintainability —
<header>/<footer>/<aside>self-document the markup; you don't read class names to learn a block's role. - 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?
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:
- var — function scope, readable as
undefinedbefore declaration, re-declarable. - let — block scope, in the TDZ until declaration, reassignment allowed.
- const — like
letbut no reassignment (the object's value itself is still mutable). - TDZ — accessing a
let/constbefore declaration throwsReferenceErrorinstead of returningundefined.
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?
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:
- What TS buys you — autocompletion and navigation, safe refactoring, self-documenting contracts, catching typos and
undefinedbefore running. - 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.
- 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?
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:
- It's an expression, not HTML — JSX compiles to JavaScript and can go anywhere an expression is allowed.
- The new JSX transform (React 17+) — imports
jsx/jsxsfromreact/jsx-runtime, so you no longer needimport Reactjust for JSX. - It returns an element object — shaped like
{ type, key, props }; real DOM appears only on render. - 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).
What is the Critical Rendering Path and which resources block it?
What is the Critical Rendering Path and which resources block it?
Short answer: The Critical Rendering Path is the browser's sequence from receiving HTML to the first painted pixel: DOM + CSSOM → render tree → layout → paint → composite. Synchronous CSS and blocking JS delay this path.
In depth:
- DOM — the browser parses HTML into a tree of nodes.
- CSSOM — the style object model is built in parallel; CSS blocks rendering because styles can't be computed without it.
- Render tree — DOM and CSSOM merge;
display: nonenodes are dropped. - Layout (reflow) — element geometry and positions are computed.
- Paint — nodes are rasterized into pixel layers.
- Composite — layers are assembled on screen (often on the GPU).
HTML ─► DOM ─┐
├─► Render Tree ─► Layout ─► Paint ─► Composite ─► screen
CSS ─► CSSOM┘
▲ blocks rendering ▲ <script> without defer/async
⚠️ Common mistake: assuming JS never interferes with rendering. A synchronous <script> in the <head> halts HTML parsing and DOM construction — use defer or move scripts to the bottom.
What is accessibility (a11y) and why does it matter?
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:
- People — about 15% of the population lives with some disability; temporary (a broken arm) and situational (bright sun, a noisy train) limitations affect everyone.
- Business — more users, better SEO (semantics = clear structure), fewer drop-offs.
- 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 121+ 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 seven 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.