Home › Blog › 30 Days of JavaScript

LeetCode 30 Days of JavaScript: A Day-by-Day Map

All 30 problems in LeetCode's free JavaScript study plan, the concept each one teaches, how long the plan really takes, and which days to take seriously if you have a frontend interview coming.

LeetCode's 30 Days of JavaScript is a free study plan of 30 short problems that teach core JavaScript rather than algorithms. As of October 2026 it has six sections: closures, basic array transformations, function transformations, promises and time, JSON, and classes. Twenty problems are easy and ten are medium, and you can answer in JavaScript or TypeScript only. Expect roughly 10 to 15 hours of focused work in total. For frontend interviews, the days that matter most are 10, 11 and 16 to 19 (once, memoize, promise time limit, a time-limited cache, debounce and your own Promise.all), plus day 26 (flatten) and day 28 (an event emitter).

We pulled the problem list from the 30 Days of JavaScript study plan on leetcode.com on October 14, 2026. LeetCode describes it as designed for JavaScript beginners, and you earn a badge when you complete it. The "days" below simply follow the plan's order at one problem a day; LeetCode does not force that pace.

What the 30 Days of JavaScript study plan includes

SectionProblemsEasy / MediumWhat it is really about
Closures44 / 0Functions that remember variables from where they were created
Basic Array Transformations33 / 0Writing map, filter and reduce yourself
Function Transformations43 / 1Functions that take and return functions: compose, once, memoize
Promises and Time84 / 4Timers, promises and async control flow, including debounce
JSON84 / 4Walking and reshaping objects and arrays
Classes32 / 1Classes, method chaining and an event emitter
Total3020 / 10

Three details are worth knowing before you start:

The day-by-day map

The last column is our own rating of how often the idea comes up in frontend interview rounds.

DayProblemLevelJavaScript conceptFrontend weight
12667. Create Hello World FunctionEasyA function that returns a functionLow
22620. CounterEasyClosure holding private stateMedium
32704. To Be Or Not To BeEasyReturning an object of methods, throwing errorsLow
42665. Counter IIEasySeveral methods sharing one closureMedium
52635. Apply Transform Over Each Element in ArrayEasyWriting map without Array.prototype.mapMedium
62634. Filter Elements from ArrayEasyWriting filter; truthy and falsy valuesMedium
72626. Array Reduce TransformationEasyWriting reduce with an initial valueMedium
82629. Function CompositionEasyComposing functions right to leftMedium
92703. Return Length of Arguments PassedEasyRest parametersLow
102666. Allow One Function CallEasyonce(): a closure flag plus argument forwardingHigh
112623. MemoizeMediumCaching results by argumentsHigh
122723. Add Two PromisesEasyPromise basics and async/awaitMedium
132621. SleepEasyWrapping setTimeout in a promiseMedium
142715. Timeout CancellationEasysetTimeout, clearTimeout and returning a cancel functionMedium
152725. Interval CancellationEasysetInterval and clearIntervalMedium
162637. Promise Time LimitMediumRacing a promise against a timeoutHigh
172622. Cache With Time LimitMediumA class with a Map and per-key expiryHigh
182627. DebounceMediumResetting a timer on every callHigh
192721. Execute Asynchronous Functions in ParallelMediumWriting your own Promise.allHigh
202727. Is Object EmptyEasyObjects vs arrays, Object.keysLow
212677. Chunk ArrayEasySlicing an array into groupsLow
222619. Array Prototype LastEasyExtending a prototype; this inside a methodMedium
232631. Group ByMediumBuilding an object keyed by a callback's resultMedium
242724. Sort ByEasySorting with a comparatorMedium
252722. Join Two Arrays by IDMediumMerging objects by key with spreadMedium
262625. Flatten Deeply Nested ArrayMediumRecursion to a given depth (your own flat)High
272705. Compact ObjectMediumRecursively removing falsy values from objects and arraysMedium
282694. Event EmitterMediumSubscribe, unsubscribe and emitHigh
292695. Array WrapperEasyvalueOf and toString on a classLow
302726. Calculator with Method ChainingEasyReturning this so calls can chainMedium

The JavaScript concepts, section by section

Closures (days 1–4)

A closure is a function that keeps access to the variables of the scope where it was created. Counter is the cleanest example: const counter = n => () => n++; returns a function that remembers n between calls. Counter II extends that to three methods sharing one variable, which is exactly how module-style private state works.

Basic array transformations (days 5–7)

You rebuild map, filter and reduce without the built-in methods. These are small, but "write a polyfill for Array.prototype.map" is a real interview warm-up, and the details matter: the callback receives the index, filter keeps truthy results, and reduce starts from the initial value you pass.

Function transformations (days 8–11)

Higher-order functions: compose, rest parameters, once and memoize. Memoize is the first medium and the first one where design choices show, such as how you build a cache key from the arguments and why a Map is a better cache than a plain object.

Promises and time (days 12–19)

The most interview-relevant section by far. You wrap timers in promises, cancel timeouts and intervals, race a promise against a deadline, build a cache whose keys expire, write debounce and finally implement Promise.all yourself. The core of debounce fits on one line: clearTimeout(id); id = setTimeout(() => fn(...args), t);. Being able to explain why the timer id lives in the closure is the follow-up you should expect.

JSON (days 20–27)

Despite the name, this section is about walking and reshaping data: checking for empty objects, chunking, grouping, sorting by a key, joining two arrays by id, flattening to a depth and recursively compacting objects. Day 22 also has you add a method to Array.prototype, a good moment to review how this works in methods.

Classes (days 28–30)

An event emitter with unsubscribe, a wrapper class that controls how it behaves with + and String() through valueOf and toString, and a calculator whose methods return this so calls can chain. The event emitter is the one to know cold: it shows up as a standalone interview question.

How long 30 Days of JavaScript takes

LeetCode does not publish a time estimate. Our estimate is 10 to 20 minutes for an easy problem in this plan and 30 to 45 minutes for a medium once you include reading and testing, which puts the whole plan at about 10 to 15 hours. Pick a pace that fits your deadline:

PaceCalendar timeBest for
One problem a day30 daysLearning JavaScript alongside a job or classes
Two or three a dayAbout 2 weeksA frontend interview in a month
Interview-first: days 8–19, 26 and 28 only3–5 daysAn interview this week and you already write JavaScript daily

If you are new to JavaScript entirely, add time for reading MDN on each concept before solving. If you are an experienced JavaScript developer, the first two sections will take minutes.

Which days matter most for frontend interviews

Frontend coding rounds often ask you to implement a utility from scratch and then explain it. From this plan, these are the ones to be able to write without help:

What the plan does not cover is just as important. There is nothing on the DOM, event delegation, event loop ordering, this binding with call, apply and bind, CSS, accessibility, React or building a UI component. Four free LeetCode problems from the original challenge fill part of the gap: 2618 Check if Object Instance of Class, 2693 Call Function with Custom Context, 2648 Generate Fibonacci Sequence and 2649 Nested Array Generator. For curry, throttle, a promise pool with a concurrency limit and deep equality, which are now Premium on LeetCode, write them yourself in a plain editor and test them in the browser console. Our frontend interview guide covers the React, CSS and UI-build rounds the plan skips.

How to practice so it transfers to interviews

  1. Close the Solutions tab until you have a working answer. These problems are short, so the temptation to peek is high. A 20-minute honest attempt teaches more than a 2-minute read.
  2. Test in a plain console. LeetCode's runner hides the edge cases you would need to think about in an interview. Call your debounce five times in a loop and log what fires.
  3. Rebuild the important ones from memory a week later. Debounce, Promise.all, memoize and the event emitter should come out clean, with no reference.
  4. Explain as you write. Interviewers ask why a closure is needed, what happens on rejection, and how you would add cancellation. Say those answers out loud while you code.
  5. Move on to algorithms after. This plan does not prepare you for data structures rounds. Follow it with LeetCode 75, solved in JavaScript, so your language practice and algorithm practice reinforce each other.

For the explaining part, CoPilot Interview's AI mock interview runs in the browser with nothing to install and includes a frontend track among its 113 real questions. The desktop app goes further: it builds questions from your résumé and a job description, lets you set the mix and choose JavaScript as your coding language, reads each question aloud and scores your spoken answer out of 10 with what to fix and a model answer.

Explain your debounce out loud before an interviewer asks

Practice frontend and coding questions with CoPilot Interview's free AI mock interview: spoken answers, a score out of 10 and a model answer for each, 15 minutes a day with no credit card.

Try a free AI mock interview

FAQ

Is LeetCode 30 Days of JavaScript free?

Yes. All 30 problems in the study plan are free as of October 2026. A bonus section of five extra problems is Premium-only, and the official editorials for 20 of the 30 problems are marked Premium, but every problem has a free community Solutions tab.

How many problems are in 30 Days of JavaScript?

Thirty, in six sections: Closures (4), Basic Array Transformations (3), Function Transformations (4), Promises and Time (8), JSON (8) and Classes (3). Twenty are easy and ten are medium.

How long does 30 Days of JavaScript take?

LeetCode does not give an estimate. Our estimate is about 10 to 15 hours of focused work: one problem a day takes 30 days, two or three a day takes about two weeks, and an interview-first pass through the most relevant days takes three to five days.

Is 30 Days of JavaScript enough for a frontend interview?

No. It covers closures, higher-order functions, promises, timers and object manipulation well, but nothing on the DOM, the event loop, React, CSS, accessibility or building UI components, and no data structures and algorithms. Use it for the JavaScript utility questions and prepare the other rounds separately.

Can I solve 30 Days of JavaScript in TypeScript?

Yes. When we checked, every problem in the plan offered JavaScript and TypeScript as its only languages.

Which 30 Days of JavaScript problems matter most for interviews?

Debounce, Execute Asynchronous Functions in Parallel (your own Promise.all), Promise Time Limit, Memoize, Allow One Function Call, Cache With Time Limit, Flatten Deeply Nested Array and Event Emitter. Practice throttle on your own as well, since it is the usual follow-up to debounce.