Собеседование на позицию JavaScript-разработчика — это не просто проверка знаний синтаксиса. Это глубокое погружение в механизмы языка, понимание его парадоксов и умение решать реальные задачи. От простых вопросов про типы данных до сложных сценариев с Event Loop и паттернами проектирования — готовность ко всему определяет ваш успех. Давайте разберем ключевые темы, которые точно встретятся вам на пути к офферу.
Фундамент: что спрашивают обязательно
Начнем с основ, без которых не обходится ни одно собеседование. Эти темы — ваш пропуск к более сложным обсуждениям.
Типы данных и приведение типов
JavaScript — язык с динамической типизацией, что является одновременно и его силой, и источником головной боли. Вам нужно четко понимать разницу между == и ===, знать, что такое "truthy" и "falsy" значения, и уметь предсказывать результаты неочевидных операций.
Классический вопрос: [] == ![] возвращает true. Почему? Это проверка на понимание приведения типов к boolean и number.
Область видимости, замыкания и this
Понимание лексической области видимости (lexical scope) — маркер опытного разработчика. Замыкание (closure) — это не просто функция внутри функции, это механизм доступа к внешней области видимости после того, как внешняя функция завершила выполнение.
- Замыкания используются для инкапсуляции, создания приватных переменных и в функциях высшего порядка.
- this определяется в момент вызова функции. Важно знать поведение в строгом режиме, при использовании
call,apply,bindи стрелочных функций (у которых нет своегоthis).
Сердце асинхронности: Event Loop, Promise, async/await
Это одна из самых сложных и важных тем. JavaScript однопоточный, но асинхронный. Как это работает?
- Event Loop — бесконечный цикл, который проверяет очередь задач (task queue) и очередь микрозадач (microtask queue). Микрозадачи (например,
.thenу Promise) имеют приоритет. - Promise — объект, представляющий завершение (или неудачу) асинхронной операции. Нужно знать цепочки
.then/.catch/.finally, статические методыPromise.all,Promise.race,Promise.allSettled. - async/await — синтаксический сахар над Promise, который делает асинхронный код похожим на синхронный. Ключевое:
asyncфункция всегда возвращает Promise.
Часто просят предсказать порядок вывода console.log в хитром примере с setTimeout, Promise и обычным кодом. Это проверка понимания Event Loop.
Работа с DOM и событиями
Для frontend-разработчика жизненно важно понимать, как взаимодействовать со страницей.
Вопросы могут касаться:
- Методов поиска элементов (
getElementById,querySelector). - Манипуляций с элементами (добавление, удаление, изменение классов, атрибутов).
- Всплытия (bubbling) и перехвата (capturing) событий, делегирования событий.
- Отличий
event.targetотevent.currentTarget.
ES6+ и современный синтаксис
Знание современных возможностей языка — must have. Будьте готовы объяснить и применить:
- let/const и временная мертвая зона (Temporal Dead Zone).
- Стрелочные функции (отсутствие своего
this,arguments, нельзя использовать как конструктор). - Деструктуризацию, спред/рест операторы (
...). - Модули (import/export).
- Классы (синтаксический сахар над прототипами).
Практические задачи и алгоритмы
Помимо теории, будут задачи. Часто — прямо в онлайн-редакторе кода.
- Реализация функций:
debounce/throttle,deepClone,curry,Promise.allполифил. - Работа с массивами без использования циклов (используя
map,filter,reduce). - Простые алгоритмические задачи на поиск, сортировку, работу со строками.
FAQ: Часто задаваемые вопросы на собеседованиях по JavaScript
В чем разница между var, let и const?
var имеет функциональную область видимости, подвержена всплытию (hoisting) и может быть переопределена. let и const имеют блочную область видимости. let можно переприсвоить, const — нет (но объект по const можно изменять).
Что такое прототипное наследование?
Это механизм, при котором объекты могут наследовать свойства и методы от других объектов. У каждого объекта есть свойство __proto__, которое ссылается на его прототип. Классы в ES6 — это синтаксический сахар над этой системой.
Как работает ключевое слово new?
При вызове new Constructor() происходит: 1) Создается новый пустой объект. 2) Его __proto__ связывается с Constructor.prototype. 3) Конструктор вызывается с this, указывающим на новый объект. 4) Если конструктор не возвращает свой объект, возвращается созданный объект.
Что такое CORS и как с ним работать?
CORS (Cross-Origin Resource Sharing) — механизм безопасности браузера, который разрешает или запрещает запросы к ресурсам на другом домене. Для работы с ним сервер должен отправлять правильные заголовки (например, Access-Control-Allow-Origin).
Объясните, что такое "strict mode"?
Режим строгого соответствия, который включает более строгую проверку кода. Например, запрещает использование необъявленных переменных, дублирование параметров функции, делает некоторые ошибки фатальными. Включается директивой "use strict".