Annual
$4.92/month equivalent
Renews annually. Cancel before your next renewal.
Practice, save your work, and unlock premium.
By continuing you agree to our Terms and Privacy Policy.
Pick a JavaScript or UI question. Write the code and run the tests in the same tab. React, Vue, Angular, and Vanilla starters are ready.
It opens in your browser. You can start without a credit card.
Get Premium for $8.25 $4.92 /monthBuild a debounce utility
Delay the callback until calls have stopped for the given wait time.
debounce(fn, 200)// Implement debounce
function debounce(fn, wait) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, wait);
};
}// Implement debounce
function debounce(fn, wait) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, wait);
};
}A real test runner
Delete clearTimeout in the live editor below. The reset test will fail, and it will pass again when you restore the line.
Type directly into the example and reset it whenever you want.
The suite runs in an isolated worker after each edit.
function debounce(fn, wait) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, wait);
};
}Premium pricing
Annual and Lifetime include every premium question, framework variant, test runner, and worked solution.
$4.92/month equivalent
Renews annually. Cancel before your next renewal.
Premium access for life
One payment. Future premium questions included.
How practice works
Write the code, check the tests, switch frameworks, and review the parts you missed. Each example below shows that part of the workflow.
Step 1 / Write and test
The prompt, editor, and test results stay in one workspace. Start from the provided files and see which case still fails before you submit.
Write the answer and run the tests.
Write and test
function debounce(fn, wait) { let timer; return function (...args) { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, wait); };}Step 2 / Switch frameworks
Practice the same component in React, Vue, Angular, or plain JavaScript. Each variant has starter code written for that framework.
Change frameworks without changing the question.
Switch frameworks
const [open, setOpen] = useState(false);
// Build the same behavior
toggleAccordion();Live preview
Gives the page structure and meaning.
Step 3 / Review the solution
Compare your code with the worked answer. The notes point to the failing case, the fix, and the reasoning you can explain in an interview.
See why your first answer missed an edge case.
Review the solution
function submit(value) {
if (submitting) return;
send(value);
}4 tests passed
The missed case
A fast second click starts another request.
The fix
Disable the action while the first request is pending.
Why it works
One guard prevents duplicate submissions.
One prompt, four implementations
Switch frameworks without leaving the question. The code on the left and the preview on the right are both live. Your answer stays separate in every variant.
import { useState } from 'react';
export default function Accordion() {
const [openId, setOpenId] = useState('html');
return sections.map((section) => (
<section key={section.id}>
<button
aria-expanded={openId === section.id}
onClick={() => setOpenId(section.id)}
>
{section.title}
</button>
{openId === section.id && <p>{section.body}</p>}
</section>
));
}Frontend foundations
HTML gives the page its structure and meaning.
Study plans
The plan tells you what to practice next. You still write every answer and run every test yourself.
1 week
42 questions
A full-time 7-day crash course covering the highest-leverage JavaScript, algorithms, and UI patterns. Six focused questions a day, ordered from language fundamentals to practical component work.
1 month
150 questions
A full-time 30-day program from fundamentals to mid-level depth: five important questions a day across JavaScript, data structures and algorithms, DOM work, hooks, and production-style components.
3 months
360 questions
The comprehensive full-time track: twelve weeks and 360 carefully prioritized questions across JavaScript, algorithms, the DOM, hooks, accessibility, and UI system-design components.
Question bank
The catalog has 680+ JavaScript, UI, browser, algorithm, and system design questions. 480+ are free.
Implement a function that delays invoking another function until a specified period of inactivity has passed.
Build an accordion component with stacked sections whose content panels expand and collapse on click.
Implement Promise.all so it resolves with an array of results or rejects on the first rejection.
Build a Todo List component with add and delete actions, with focus on functionality over styling.
Build an image carousel that lets you page through a sequence of images with previous and next controls.
Implement a function that limits how often a wrapped function can be invoked within a time window.
Your next question is ready
The free question includes the prompt, editor, and tests. Sign in when you want UIReady to save your code and progress.
FAQ
Everything you need to know before opening your first frontend interview question.
480+ questions are free. The editor, tests, previews, and progress tracking all work on the free tier.
UI questions are available in React, Vue, Angular, and plain HTML, CSS, and JavaScript. Your work is saved separately for each variant.
Yes. The Debounce example runs its test suite in an isolated browser worker, and the Accordion example compiles a real preview in the framework you pick.
Open the worked solution after you have tried the problem. It covers the implementation, missed edge cases, complexity, and the reasoning an interviewer may ask you to explain.