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
| Section | Problems | Easy / Medium | What it is really about |
|---|---|---|---|
| Closures | 4 | 4 / 0 | Functions that remember variables from where they were created |
| Basic Array Transformations | 3 | 3 / 0 | Writing map, filter and reduce yourself |
| Function Transformations | 4 | 3 / 1 | Functions that take and return functions: compose, once, memoize |
| Promises and Time | 8 | 4 / 4 | Timers, promises and async control flow, including debounce |
| JSON | 8 | 4 / 4 | Walking and reshaping objects and arrays |
| Classes | 3 | 2 / 1 | Classes, method chaining and an event emitter |
| Total | 30 | 20 / 10 |
Three details are worth knowing before you start:
- All 30 problems are free. A seventh section, "Summarize Your 30-day Journey with Bonus Challenges!", holds five more problems and is Premium-only.
- Most official editorials are locked. When we checked, the official editorial was marked Premium for 20 of the 30 problems. Each problem still has a free Solutions tab of community write-ups.
- The set has changed since launch. NeetCode's 30-video series for the challenge, linked from its 30-Day JavaScript Coding Challenge lesson, follows an earlier problem set that included Curry, Throttle, Promise Pool and JSON Deep Equal. Those four are Premium-only on LeetCode now, which is one reason older guides list different days.
The day-by-day map
The last column is our own rating of how often the idea comes up in frontend interview rounds.
| Day | Problem | Level | JavaScript concept | Frontend weight |
|---|---|---|---|---|
| 1 | 2667. Create Hello World Function | Easy | A function that returns a function | Low |
| 2 | 2620. Counter | Easy | Closure holding private state | Medium |
| 3 | 2704. To Be Or Not To Be | Easy | Returning an object of methods, throwing errors | Low |
| 4 | 2665. Counter II | Easy | Several methods sharing one closure | Medium |
| 5 | 2635. Apply Transform Over Each Element in Array | Easy | Writing map without Array.prototype.map | Medium |
| 6 | 2634. Filter Elements from Array | Easy | Writing filter; truthy and falsy values | Medium |
| 7 | 2626. Array Reduce Transformation | Easy | Writing reduce with an initial value | Medium |
| 8 | 2629. Function Composition | Easy | Composing functions right to left | Medium |
| 9 | 2703. Return Length of Arguments Passed | Easy | Rest parameters | Low |
| 10 | 2666. Allow One Function Call | Easy | once(): a closure flag plus argument forwarding | High |
| 11 | 2623. Memoize | Medium | Caching results by arguments | High |
| 12 | 2723. Add Two Promises | Easy | Promise basics and async/await | Medium |
| 13 | 2621. Sleep | Easy | Wrapping setTimeout in a promise | Medium |
| 14 | 2715. Timeout Cancellation | Easy | setTimeout, clearTimeout and returning a cancel function | Medium |
| 15 | 2725. Interval Cancellation | Easy | setInterval and clearInterval | Medium |
| 16 | 2637. Promise Time Limit | Medium | Racing a promise against a timeout | High |
| 17 | 2622. Cache With Time Limit | Medium | A class with a Map and per-key expiry | High |
| 18 | 2627. Debounce | Medium | Resetting a timer on every call | High |
| 19 | 2721. Execute Asynchronous Functions in Parallel | Medium | Writing your own Promise.all | High |
| 20 | 2727. Is Object Empty | Easy | Objects vs arrays, Object.keys | Low |
| 21 | 2677. Chunk Array | Easy | Slicing an array into groups | Low |
| 22 | 2619. Array Prototype Last | Easy | Extending a prototype; this inside a method | Medium |
| 23 | 2631. Group By | Medium | Building an object keyed by a callback's result | Medium |
| 24 | 2724. Sort By | Easy | Sorting with a comparator | Medium |
| 25 | 2722. Join Two Arrays by ID | Medium | Merging objects by key with spread | Medium |
| 26 | 2625. Flatten Deeply Nested Array | Medium | Recursion to a given depth (your own flat) | High |
| 27 | 2705. Compact Object | Medium | Recursively removing falsy values from objects and arrays | Medium |
| 28 | 2694. Event Emitter | Medium | Subscribe, unsubscribe and emit | High |
| 29 | 2695. Array Wrapper | Easy | valueOf and toString on a class | Low |
| 30 | 2726. Calculator with Method Chaining | Easy | Returning this so calls can chain | Medium |
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:
| Pace | Calendar time | Best for |
|---|---|---|
| One problem a day | 30 days | Learning JavaScript alongside a job or classes |
| Two or three a day | About 2 weeks | A frontend interview in a month |
| Interview-first: days 8–19, 26 and 28 only | 3–5 days | An 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:
- Debounce (day 18) and its sibling throttle, which is not in the free plan. Write throttle yourself after debounce; it is the obvious follow-up.
- Promise.all (day 19), Promise Time Limit (day 16) and Sleep (day 13): the async trio. Know how results keep their order and what happens when one promise rejects.
- Memoize (day 11) and once (day 10), both classic closure questions.
- Cache With Time Limit (day 17), which combines a class, a Map and timers.
- Event Emitter (day 28) and Flatten (day 26), both common standalone questions.
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
- 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.
- 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.
- Rebuild the important ones from memory a week later. Debounce, Promise.all, memoize and the event emitter should come out clean, with no reference.
- 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.
- 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 interviewFAQ
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.