P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🟨

Вопросы на собеседовании JavaScript

Собеседование по JavaScript крутится вокруг небольшого набора вещей, которые язык делает иначе, чем все остальные: замыкания, `this`, прототипы и event loop. Разберитесь с ними — и большинство остальных вопросов закроются сами. Ниже те, что задают чаще всего, каждый с эталонным ответом.

Junior · без опыта / до 1 годаMiddle · 2–4 года опытаSenior · 5+ лет опыта

Что спрашивают

Типы и приведение
Замыкания и области видимости
`this` и прототипы
Event loop и асинхронность
Промисы и async/await
DOM, события и браузер

10 реальных вопросов с ответами

К каждому вопросу — эталонный ответ, с которым можно сравнить свой.

1

Какие типы данных есть в JavaScript?

Ответ

Семь примитивов — string, number, boolean, null, undefined, symbol, bigint, — а всё остальное объекты, включая массивы и функции. Примитивы копируются по значению, объекты по ссылке, и отсюда почти вся путаница вида «почему изменение одной переменной изменило другую». typeof null возвращает 'object' — это баг 1995 года, который нельзя починить, не сломав веб.

2

Чем различаются `var`, `let` и `const`?

Ответ

var имеет функциональную область видимости и всплывает как undefined; let и const ограничены блоком и до объявления находятся во временной мёртвой зоне, поэтому обращение к ним раньше бросает ошибку, а не отдаёт undefined. const запрещает переприсваивание переменной, а не изменение объекта, на который она указывает: const arr = [] не мешает arr.push(). По умолчанию const, let — когда действительно переприсваиваете, var — никогда.

3

Чем `==` отличается от `===`?

Ответ

=== сравнивает тип и значение, == сначала приводит типы по правилам, из-за которых null == undefined истинно, а null == 0 ложно. Поскольку всю таблицу почти никто не помнит, рабочее правило — всегда ===. Единственное защитимое исключение — x == null как краткая проверка сразу на null и undefined.

4

Что такое замыкание?

Ответ

Функция вместе с областью видимости, в которой она создана и к которой сохраняет доступ даже после того, как внешняя функция завершилась. Именно на этом держатся приватное состояние, фабрики функций и хуки: внутренняя функция хранит живую ссылку, а не копию. Классическая ловушка — var в цикле с setTimeout, где все колбэки делят одну привязку и печатают одно значение; let даёт каждой итерации свою.

5

Что такое `this` и чем он определяется?

Ответ

Тем, как функция вызвана, а не тем, где объявлена. Вызов методом — this это объект перед точкой; простой вызов — undefined в строгом режиме; вызов через new — новый объект; call, apply и bind задают явно. У стрелочных функций своего this нет, они берут его из окружающей области, поэтому они и решили проблему колбэков, и поэтому же не годятся как методы объекта.

6

Как работает прототипное наследование?

Ответ

У каждого объекта есть скрытая ссылка на другой объект — прототип. При чтении отсутствующего свойства движок идёт по этой цепочке, пока не найдёт его или не дойдёт до null. class — синтаксис поверх этого: он создаёт функцию-конструктор, в объекте prototype которой лежат методы, поэтому все экземпляры делят одну копию каждого метода, а не носят свою.

7

Объясните event loop, макрозадачи и микрозадачи.

Ответ

JavaScript выполняется в одном потоке с очередью. Когда стек вызовов пустеет, цикл вычерпывает всю очередь микрозадач — колбэки промисов, queueMicrotask, MutationObserver — и только потом берёт одну макрозадачу: колбэк setTimeout или событие. Поэтому .then всегда выполняется раньше запланированного ранее setTimeout(0), и поэтому бесконечная цепочка микрозадач способна полностью заморозить отрисовку.

8

Чем `Promise.all` отличается от `Promise.allSettled`?

Ответ

all отклоняется, как только отклонился любой промис, и результатов остальных вы не получаете; allSettled всегда резолвится, отдавая статус по каждому. all берут, когда при падении одной части вся операция бессмысленна, allSettled — когда надо сообщить, что именно упало. И это не то же, что последовательные await в цикле: те выполняются один за другим, и обычно это случайный баг производительности.

9

Чем поверхностная копия отличается от глубокой?

Ответ

Поверхностная — спред или Object.assign — копирует верхний уровень, поэтому вложенные объекты остаются общими и их изменение задевает оригинал. Глубокая дублирует всё дерево: structuredClone делает это нативно и справляется с циклами, Map и Date, тогда как старый приём JSON.parse(JSON.stringify(x)) молча теряет функции, undefined и превращает даты в строки.

10

Чем стрелочная функция отличается от обычной?

Ответ

У стрелочной нет своего this, нет arguments, нет prototype, и её нельзя вызвать через new. this она берёт лексически оттуда, где объявлена, — за это её и любят в колбэках и за это же она не годится как метод объекта или прототипа. Конструктором и генератором она тоже быть не может.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью JavaScript →
Бесплатно · 3 интервью в месяц

Стоит прочитать

Все статьи →

Другие специализации

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing