JavaScript coding interview questions come in two kinds, and most lists mix them up. The first kind is about the language: closures, this, promises, the event loop, implementing debounce. The second kind is data structures and algorithms, asked in JavaScript because that is what you write all day. This post is about the second kind, because it is the one that fails frontend candidates most often, and because the fix is narrower than people think.
How much DSA a frontend loop asks
Less than a backend loop, and a different slice of it. In DSA Tracker's role map, a frontend engineer has 6 core topics out of 22, covering 84 problems of the 370, versus 10 topics and 260 problems for a backend engineer. The core six are Arrays, Strings, Two Pointers, Sliding Window, Stack and Linked List, with Binary Trees and Recursion as the second tier. Graphs and Dynamic Programming are marked optional: they show up, but not in the first round, and rarely at all in a product frontend loop.
That is the whole strategy. Do the six core topics until they are boring. Skip the deep end until you have an offer to protect.
The problems, in the order to do them
All of these are in the tracker, with a write-up on each page. Solve them in JavaScript; the point is fluency in the language you will use on the day.
Arrays and hashing. The Map and Set objects are your first tool.
Strings. Frontend rounds love these because the interviewer can dress them up as parsing input or formatting output.
Two pointers and sliding window. The two patterns that turn an O(n²) brute force into one pass.
Stack and linked list. Short topics, and the ones where JavaScript candidates are weakest, because you rarely build a linked list in application code.
Trees, second tier. The DOM is a tree, so an interviewer can justify these.
JavaScript-specific things to know while solving these
Map and Set are O(1) average for insert and lookup, and Map keeps insertion order. Plain objects work for string keys, but use Map when keys are numbers or objects.
- There is no built-in priority queue or deque.
Array.prototype.shift() is O(n); if a problem needs a real queue at scale, keep a head index instead of shifting.
sort() compares as strings by default. [10, 9, 1].sort() gives [1, 10, 9]. Always pass a comparator for numbers.
- Recursion depth is limited (roughly ten thousand frames in most engines). Deep linked lists and skewed trees can overflow; know the iterative version.
- Integers are exact up to 2^53; use
BigInt past that, or the problem's modulus.
The language questions
Closures, this, promise ordering, event loop, debounce and throttle, deep clone, flatten, Array.prototype.map from scratch: these are asked, and they are not in the tracker, because the tracker is a DSA tool. Prepare them separately. The one place they overlap is that implementing debounce or flatten is itself a small algorithm question, so the habit of thinking in inputs, state and edge cases carries over.
Practising in JavaScript
Every problem in the tracker opens in an in-browser editor with JavaScript as a first-class language, and the tracer steps through your own JavaScript line by line, showing every variable, array and call as it changes. It runs entirely in your browser; nothing is sent to a server. Use it on the linked-list and tree problems above, where most mistakes are pointer mistakes you cannot see in a console.log.