Вопросы на собеседовании: Фулстек-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Фулстек-разработчик →Вопросы
var имеет область видимости функции и поднимается, тогда как let и const блочные.
- var: поднимается к началу функции и доступна до строки объявления
- let и const: блочная область видимости, недоступны до объявления
- let допускает переприсвоение, const нет, хотя свойства const-объекта можно менять
- По умолчанию используйте const, а let только когда переприсвоение действительно нужно
Зачем это спрашивают: Проверяет понимание правил области видимости, hoisting и современных соглашений JavaScript, а не опору на устаревший var.
Замыкание, это функция, сохраняющая доступ к переменным внешней области даже после её завершения.
- Сохраняет переменные внешней лексической области после выхода из внешней функции
- Пример: фабрика счётчика возвращает внутреннюю функцию, инкрементирующую приватный count
- Каждый вызов фабрики создаёт независимый счётчик
- Основа мемоизации, модульных паттернов и обработчиков событий с памятью состояния
Зачем это спрашивают: Сильный ответ демонстрирует понимание цепочки областей видимости, а не просто то, что замыкания помнят переменные из внешней области.
Node.js выполняет JavaScript в одном потоке, но выносит I/O, чтобы не блокироваться.
- Делегирует I/O вроде чтения файлов и сетевых запросов ОС или пулу потоков libuv
- Завершённая асинхронная операция помещает свой коллбэк в очередь цикла событий
- Цикл событий выполняет коллбэк, когда стек вызовов пуст
- Позволяет Node.js обрабатывать тысячи одновременных подключений без блокировки
Зачем это спрашивают: Проверяет ментальную модель параллелизма в Node.js, которая критична для написания неблокирующего серверного кода.
== сравнивает после приведения типов, а === проверяет значение и тип без приведения.
- == сначала приводит типы, поэтому 0 == false равно true
- === проверяет и значение, и тип, поэтому 0 === false равно false
- В продакшне используйте === во избежание багов от неявного преобразования
Зачем это спрашивают: Кандидаты, полагающиеся на == без понимания приведения типов, часто вносят трудноотлавливаемые баги в логику условий.
Promise представляет конечный результат асинхронной операции.
- Имеет три состояния: ожидание, успех или ошибка
- Вы цепляете .then() и .catch() для обработки результата
- async/await, это сахар поверх Promise, читающийся как синхронный код
- Ошибки обрабатываются через try/catch, а не цепочки обработчиков
Зачем это спрашивают: Проверяет понимание жизненного цикла Promise и способность связать синтаксис async/await с лежащим в его основе механизмом.
Функция высшего порядка принимает функцию в аргументы, возвращает функцию, или и то и другое.
- map, filter и reduce, типичные примеры
- map принимает коллбэк и применяет его к каждому элементу, возвращая новый массив той же длины
- Позволяет создавать компонуемую и переиспользуемую логику
- Лежит в основе функционального программирования на JavaScript
Зачем это спрашивают: Позволяет оценить понимание функций первого класса, которые лежат в основе современного JavaScript и дизайна React.
undefined значит, что значение не задано, а null, это намеренная пустота.
- undefined: значение по умолчанию для объявленной без инициализации переменной или непереданного параметра
- null: намеренное присвоение, отмечающее отсутствие значения
- Оба значения ложные (falsy)
- typeof undefined возвращает 'undefined', а typeof null, 'object', исторический баг
Зачем это спрашивают: Различение этих двух значений выявляет кандидатов, понимающих систему типов JavaScript и умеющих избегать багов с неинициализированными переменными.
Деструктуризация лаконично извлекает значения массивов или свойства объектов в отдельные переменные.
- Работает и с массивами, и с объектами, раскладывая поля по переменным
- Пример: const { name, age } = user извлекает поля напрямую без отдельных обращений
- Сокращает повторяющиеся обращения к свойствам
- Особенно удобна с параметрами функций, ответами API и пропсами React
Зачем это спрашивают: Проверяет знакомство с современным синтаксисом ES6+, который повсеместно используется в React и Node.js.
Интерфейс описывает форму объекта, а псевдоним типа, любой тип.
- Интерфейсы расширяются и реализуются классами, а одноимённые объединяются автоматически
- Псевдонимы покрывают объединения, примитивы и кортежи, не только объекты, без слияния объявлений
- Для расширяемых форм объектов предпочтительны интерфейсы
- Для объединений и вычисляемых типов предпочтительны псевдонимы типов
Зачем это спрашивают: Проверяет практическое знание TypeScript: понимает ли кандидат, когда использовать каждый инструмент, а не считает ли их взаимозаменяемыми.
TypeScript выводит тип переменной из её начального значения.
- const count = 0 получает тип number без явной аннотации
- Вывод также охватывает возвращаемые типы функций и параметры обобщений
- Он применяется и к деструктурированным значениям
- Сокращает количество аннотаций при сохранении полной типобезопасности
Зачем это спрашивают: Кандидат, понимающий вывод типов, пишет более чистый TypeScript и не аннотирует каждую переменную избыточно.
Spread раскрывает итерируемое в отдельные элементы, а rest собирает аргументы в массив.
- Spread объединяет массивы [...arr1, ...arr2] или клонирует объекты { ...original, key: newValue }
- Rest использует тот же синтаксис в определении функции, например function sum(...numbers)
- Оба постоянно встречаются при обновлении состояния в React и в сигнатурах утилит
Зачем это спрашивают: Spread и rest повсеместны в современном JavaScript; проверка знания их синтаксиса оценивает готовность к повседневной работе.
Каждый объект JavaScript ссылается на объект-прототип, образуя цепочку.
- Обращение к свойству идёт вверх по цепочке, пока не найдёт его или не достигнет null
- Классы ES6, это синтаксический сахар поверх этой цепочки прототипов
- Они не вводят классическую модель наследования, как в Java или C#
Зачем это спрашивают: Понимание цепочки прототипов помогает отлаживать неожиданные поиски свойств и понимать, почему методы вроде .toString() доступны на любом объекте.
Синхронный код блокирует поток до конца каждой операции, асинхронный, нет.
- Синхронный выполняется строка за строкой, что может заморозить интерфейс или сервер на долгих задачах
- Асинхронный начинает операцию и продолжает выполнять другой код в ожидании
- Результат приходит через коллбэк, Promise или async/await
- Почти весь I/O вроде запросов к базе и HTTP-вызовов должен быть асинхронным во избежание блокировки
Зачем это спрашивают: Непонимание разницы между sync и async является корневой причиной замороженных интерфейсов и неотзывчивых серверов на Node.js.
CommonJS использует require и работает синхронно, а ES Modules используют import и поддерживают tree shaking.
- CommonJS: require() и module.exports, синхронно, устаревший стандарт Node.js
- ES Modules: import и export, статический анализ и tree shaking, актуальный стандарт
- Формат модулей влияет на разрешение импортов и удаление неиспользуемого кода при бандлинге
Зачем это спрашивают: Интервьюеры проверяют, может ли кандидат работать в кодовой базе, где смешаны оба формата, и понимает ли он практические различия.
Коллбэк, это функция, переданная другой функции для вызова после завершения асинхронной операции.
- Передаётся как аргумент и вызывается по завершении операции
- Вложение коллбэков на несколько уровней порождает callback hell, трудный для чтения и поддержки
- Promise и async/await устраняют вложенность и восстанавливают читаемый последовательный поток
Зачем это спрашивают: Вопрос о коллбэках и их недостатках проверяет, понимает ли кандидат историческую эволюцию асинхронного JavaScript и почему появились современные паттерны.
Обобщения позволяют писать переиспользуемый код для разных типов с сохранением типобезопасности.
- Пример: identity<T>(value: T): T принимает любой тип и возвращает тот же тип
- При этом информация о типе не теряется
- Часто встречаются в утилитарных типах, обёртках для запросов и API переиспользуемых компонентов React
- Полезны, когда точный тип не известен на момент написания
Зачем это спрашивают: Обобщения, это шаг выше базового знания TypeScript; кандидат, понимающий их, может создавать по-настоящему переиспользуемые типизированные абстракции.
map преобразует, filter отбирает, reduce накапливает.
- map преобразует каждый элемент и возвращает новый массив той же длины
- filter возвращает только элементы, прошедшие предикат, и может быть короче исходного
- reduce накапливает все элементы в одно значение, например сумму, объект или массив
Зачем это спрашивают: Эти три метода постоянно используются как при рендеринге данных на фронтенде, так и при обработке данных на бэкенде, поэтому свободное владение ими является базовым требованием.
Опциональная цепочка безопасно читает вложенные свойства, а нулевое слияние подставляет значение по умолчанию только для null или undefined.
- ?. возвращает undefined вместо ошибки, если промежуточное значение null или undefined, например user?.address?.city
- ?? возвращает правый операнд только если левый null или undefined, в отличие от ||, который срабатывает и на 0 или пустую строку
- Вместе user?.name ?? 'Аноним' даёт чистую и безопасную логику значений по умолчанию
Зачем это спрашивают: Оба оператора встречаются в современных кодовых базах и устраняют многословные проверки на null; уверенное владение ими говорит об актуальных знаниях JavaScript.
Виртуальный DOM, это лёгкое дерево JavaScript-объектов, зеркалящее реальный DOM.
- При изменении состояния React строит новое виртуальное дерево и сравнивает его с предыдущим снимком
- Затем применяет только минимальный набор нужных реальных DOM-мутаций
- Быстрее, чем трогать реальный DOM при каждом изменении, ведь операции с ним затратны
- Освобождает разработчиков от ручного отслеживания того, какие элементы обновить
Зачем это спрашивают: Понимание виртуального DOM объясняет, почему React-компоненты перерисовываются, и закладывает основу для рассуждений об оптимизации рендеринга.
Управляемый компонент хранит значение в состоянии React, неуправляемый, в DOM.
- Управляемый: React, единственный источник истины, каждое нажатие вызывает обновление состояния и перерисовку
- Неуправляемый: значение в DOM, читается через ref по необходимости, без состояния React
- Управляемые дают предсказуемое поведение и упрощают валидацию
- Неуправляемые проще для случаев вроде загрузки файлов
Зачем это спрашивают: Это различает кандидатов, понимающих модель потока данных React, от тех, кто просто копирует паттерны форм не понимая, как они работают.
Закрытые вопросы
- 21
Что такое useState и чем он отличается от обычной переменной в компоненте?
componentshooks - 22
Как работает useEffect и какова роль его массива зависимостей?
hooksdependencies - 23
Что такое жизненный цикл компонента React в функциональных компонентах?
reactcomponents - 24
Когда следует использовать useCallback и useMemo?
- 25
Что такое prop drilling и как Context API помогает его решить?
stateapi - 26
Как обрабатывать формы в React?
soft-skillsreact - 27
В чём разница между React.memo и useMemo?
react - 28
Как работает проп key в списках React и почему он важен?
react - 29
Что такое Next.js и какие проблемы он решает по сравнению с чистым React?
reactnextjs - 30
В чём разница между getServerSideProps и getStaticProps в Next.js?
nextjs - 31
Как устроена маршрутизация в App Router Next.js?
nextjs - 32
Что такое Tailwind CSS и чем он отличается от традиционных CSS-фреймворков вроде Bootstrap?
csstailwind - 33
Как реализовать адаптивную вёрстку с помощью Tailwind CSS?
csstailwindresponsive - 34
Что такое специфичность CSS и как она вычисляется?
css - 35
В чём разница между CSS Flexbox и CSS Grid?
cssflexboxgrid - 36
Зачем нужна семантическая HTML-разметка?
htmla11y - 37
Как реализовать клиентскую навигацию в Next.js без полной перезагрузки страницы?
soft-skillsnextjs - 38
Что такое правила хуков в React и почему они существуют?
reacthooks - 39
Что такое Node.js и что делает его подходящим для разработки веб-серверов?
- 40
Как Express обрабатывает роутинг и middleware?
middleware - 41
Что такое цикл запрос-ответ в Express-приложении?
- 42
Как обрабатывать ошибки в Express-приложении?
soft-skills - 43
В чём разница между HTTP-методами GET, POST, PUT, PATCH и DELETE?
http - 44
Что такое HTTP-статус-коды и что означает каждый диапазон?
httpstatus-codes - 45
Как валидировать данные запроса в Node.js API?
validationapi - 46
Что такое CORS и как его настроить в Express-приложении?
configcors - 47
Как структурировать REST API проект для ясности и поддерживаемости?
rest - 48
Зачем нужны переменные окружения и как ими управлять в Node.js?
config - 49
Как реализовать пагинацию в REST API?
restpagination - 50
Что такое ограничение частоты запросов (rate limiting) и зачем добавлять его в API?
rate-limiting - 51
Как обрабатывать загрузку файлов на Node.js-сервере?
soft-skills - 52
Что такое JSON Web Token и как он работает для аутентификации в API?
authtokensapi - 53
Чем сессионная аутентификация отличается от токен-based аутентификации?
authtokenssessions - 54
В чём разница между SQL и NoSQL базами данных?
sqlnosqldatabase - 55
Когда следует выбирать PostgreSQL вместо MongoDB?
postgresmongodb - 56
Что такое индекс базы данных и почему он важен для производительности запросов?
databaseindexesqueries - 57
Объясните базовые типы SQL JOIN: INNER JOIN, LEFT JOIN и RIGHT JOIN.
sqljoins - 58
Что такое нормализация базы данных и какие проблемы она решает?
databasenormalization - 59
Как Prisma ORM упрощает работу с базой данных в проекте на Node.js и TypeScript?
databaseormtypescript - 60
Что такое транзакция в базе данных и когда её использовать?
databasetransactions - 61
Как предотвратить SQL-инъекции в приложении?
sqlinjection - 62
Что такое проблема N+1 запросов и как её избежать?
queriesn+1 - 63
Как спроектировать простую схему «пользователи и посты» в реляционной базе данных?
databaseschemadesign - 64
Опишите полный цикл запрос-ответ, когда браузер получает данные от API.
api - 65
В чём разница между серверным рендерингом, клиентским рендерингом и генерацией статических сайтов?
ssr - 66
Что такое HTTPS и почему он необходим для продакшн веб-приложений?
https - 67
Что такое cookie и localStorage и каковы ключевые различия при хранении токенов аутентификации?
authtokenscookies - 68
Чем REST API отличается от GraphQL API на базовом уровне?
restgraphql - 69
Что такое WebSocket и когда его использовать вместо обычного HTTP?
httpwebsockets - 70
Что такое CSRF и как от него защититься?
csrf - 71
Как раздача контента через CDN улучшает производительность приложения?
performance - 72
Для чего предназначен HTTP-заголовок Authorization?
authhttp - 73
Как структурировать новую сквозную функцию от таблицы базы данных до отрендеренного React-компонента?
reactcomponentsdatabase - 74
Что такое Git и в чём разница между слиянием (merge) и перебазированием (rebase) веток?
git - 75
Какую стратегию ветвления вы использовали бы в командном проекте?
- 76
Что такое Docker и почему джуниору стоит его понимать?
docker - 77
Что такое CI/CD пайплайн и что он обычно включает?
ci-cd - 78
Как Vercel упрощает деплой Next.js приложения?
nextjsdeployment - 79
Что такое GitHub Actions и как его использовать для базового воркфлоу Node.js?
ci-cd - 80
Как управлять разными средами, разработкой, staging и продакшном, в full-stack проекте?
- 81
Что такое файл package.json и каковы его ключевые поля?
npm - 82
Чем pnpm отличается от npm?
pnpmnpm - 83
Что такое ESLint и почему он ценен в проекте?
eslint - 84
Что такое юнит-тестирование и чем оно отличается от интеграционного тестирования?
unitintegration - 85
Как написать базовый тест для React-компонента с помощью React Testing Library?
reactcomponentsrtl - 86
Что такое мокирование в тестах и зачем оно нужно?
mocking - 87
Что измеряет покрытие тестами и каковы его ограничения?
coverage - 88
Как тестировать REST API эндпоинт в Node.js?
restendpoints - 89
Как вы подходите к изучению новой технологии или фреймворка, с которым раньше не работали?
- 90
Опишите проект, в котором вы построили что-то от базы данных до интерфейса. Что было самым сложным?
database - 91
Как вы реагируете на обратную связь в ходе код-ревью?
soft-skillsfeedbackcode-review - 92
Что вы будете делать, если застряли на баге несколько часов?
problem-solving - 93
Как вы приоритизируете задачи, когда одновременно есть несколько дел?
prioritization - 94
Расскажите о случае, когда вы улучшили существующий код. Что вас мотивировало?
- 95
Как вы обеспечиваете понятность вашего кода для других разработчиков?
- 96
Как вы оцениваете, сколько времени займёт задача разработки?
estimation - 97
Что для вас означает «готово», когда вы завершаете функцию?
- 98
Как вы следите за изменениями в экосистеме JavaScript и веб-разработки?
learningjavascript - 99
Расскажите об ошибке, которую вы допустили в техническом проекте, и чему она вас научила.
ownership - 100
Почему вы хотите работать full-stack разработчиком, а не специализироваться только на фронтенде или бэкенде?
motivation