Загрузка…
Загрузка…
frontend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
90 мин
01
Код
Задача на this: есть объект usersService с полями currentFilter, active, массивом users и методом getFilteredUsers (внутри filter используется обычная function). Что выведется в консоли при вызове usersService.getFilteredUsers()?
Лайвкодинг, задача №1. Кандидат разбирает, что this внутри обычной function-колбэка в filter не равен usersService.
02
Теория
Что такое this в JavaScript?
Теоретическая врезка по ходу задачи №1.
03
Теория
Чему будет равен this внутри обычной function-колбэка (не стрелочной) в браузере в нестрогом режиме?
Ответ: window (в non-strict режиме).
04
Теория
А что будет с this в strict mode в этой же ситуации?
Заметки
Первое из трёх технических собеседований во фронтенд (компания — Тбанк, банк; интервьюер из отдела геймификации, делают игры внутри мобильного банка через WebView на Three.js + Cannon). Дальше по воронке: собеседование по алгоритмам (уровень medium, как на LeetCode), system design, затем «фиты» — взаимный выбор команды кандидатом и командой. Формат — лайвкодинг с шарингом экрана: задачи на this, event loop, ререндеры в React, реализация слот-машины и deepCopy. В разговоре также упоминается Яндекс (для сравнения условий), но собеседование — в одну компанию.
Подготовка
Готовиться к следующим этапам: алгоритмы уровня medium (типа LeetCode) и system design — интервьюер назвал system design самым сложным и важным этапом. На лайвкодинге важна база: this, event loop (микро/макротаски), мемоизация в React (React.memo, useCallback), рекурсия для deepCopy.
Стиль интервьюера
Доброжелательный и разговорчивый интервьюер: постепенно усложняет каждую задачу, наводит на правильные мысли вместо прямых подсказок, разрешает пользоваться консолью и запускать код, делится дополнительными фактами (thisArg у filter, structuredClone), в конце даёт фидбек и подробно рассказывает о компании и процессе.
Follow-up к вопросу про this в нестрогом режиме.
05
Код
Как исправить код, чтобы this внутри колбэка filter указывал на нужный объект?
Кандидат переделал колбэк на стрелочную функцию.
06
Теория
Назови ещё один способ исправить проблему с this, не меняя function на стрелочную функцию.
Кандидат предложил bind. Интервьюер дополнил, что у filter есть второй параметр thisArg.
07
Код
Задача на event loop: дан код с синхронными console.log, двумя setTimeout и промисом (.then). В каком порядке выведутся сообщения в консоли и почему?
Лайвкодинг, задача №2. Правильный ответ для базового варианта: 1 4 6 3 2 5.
08
Теория
Что такое event loop? Расскажи про микротаски и макротаски.
Вопрос «по базе» перед разбором задачи на event loop.
09
Теория
События пользовательского ввода (клики и т.д.) — это какие задачи: микротаски или макротаски?
Ответ: макротаски.
10
Код
Усложнение задачи на event loop: добавлена функция, которая рекурсивно вызывает себя через промис (микротаски). Каким будет порядок вывода и что произойдёт с интерфейсом?
Ответ: очередь микротасков зациклится, интерфейс зависнет, ввод пользователя обрабатываться не будет.
11
Код
Следующее усложнение: рекурсивный вызов через setTimeout вместо промиса. Каким будет порядок вывода и поведение интерфейса?
Макротаски выполняются по одной, интерфейс может оставаться частично рабочим. Интервьюер уточнил «ты тут ничего не забыл?» — кандидат забыл тройку (промис).
12
Код
Последнее усложнение задачи на event loop: промис резолвится внутри setTimeout. Каким будет порядок вывода сообщений?
Ответ кандидата: 1 4 6 3 2 7 5 — верно.
13
Код
React-задача: есть три компонента и хук useForceUpdate. Какие компоненты будут рендериться при клике на кнопку Render и почему?
Ответ: отрендерятся все (parent и child без мемоизации).
14
Теория
Что значит, что компонент «без мемоизации»? Что такое мемоизация компонента?
Теоретическая врезка по ходу React-задачи.
15
Код
Будет ли рендериться компонент Child при наборе текста в input? Если будет — почему?
Ответ: будет, т.к. onChange обновляет state в родителе и пропсы меняются.
16
Код
Как исправить лишний ререндер компонента Child при наборе текста в input?
Решение: обернуть компонент в React.memo и обработчик в useCallback с пустым массивом зависимостей.
17
Теория
Что такое React.memo — это хук или что-то другое?
18
Теория
Что делает useCallback? Что будет храниться в handleChange после оборачивания в useCallback?
Ответ: стабильная ссылка на функцию, которая не меняется между рендерами.
19
Код
Реализовать на React простую слот-машину («однорукий бандит»): три барабана с цифрами от 0 до 9, которые крутятся и останавливаются в разное время (дан класс runSpinner с колбэками onRoll/onStop и затухающей velocity); во время вращения кнопка должна быть задизейблена и раздизейблена только когда остановились все три барабана.
Основная лайвкодинг-задача. Использованы useState, useEffect, подсчёт остановок через функциональный setState, рандомизация начального индекса через предоставленную randomInt.
20
Код
Усложнение к слот-машине: добавить базовую проверку на выигрыш — если все три значения совпали после остановки барабанов, вывести текст «вы победитель».
Прокидывание order/value через onStop наверх и сравнение трёх результатов.
21
Код
Как бы ты улучшил/оптимизировал текущий код слот-машины? Что можно вынести или отрефакторить?
Кандидат предложил вынести колбэк onStop, checkResult в отдельную функцию и стейты в кастомные хуки.
22
Код
Как реализовать проверку «три в ряд» для слот-машины — когда выпали последовательные цифры (например 1, 2, 3) и это тоже считается выигрышем?
Решение через разницу соседних значений: results[1] - results[0] === 1 и results[2] - results[1] === 1.
23
Теория
Какие стандартные методы/способы глубокого копирования объектов в JavaScript ты знаешь?
Кандидат вспомнил lodash cloneDeep.
24
Теория
Слышал ли ты про structuredClone?
Кандидат не вспомнил.
25
Код
Реализовать функцию deepCopy для глубокого копирования объекта в JavaScript: поддержать примитивы, объекты и массивы; прототипы и циклические ссылки можно игнорировать, вложенность конечная.
Лайвкодинг, последняя задача. Рекурсивное решение через Object.entries с отдельной обработкой массивов (Array.isArray).
26
Теория
Что делает Object.create(null)? Если глубоко скопировать объект с null-прототипом нашей функцией deepCopy, будут ли прототипы копии и оригинала равны?
Опциональное усложнение в конце задачи про deepCopy.
27
Поведенческий
Чем бы ты сам хотел заниматься? Какая область деятельности тебя интересует?
Задан в конце собеседования при обсуждении выбора команды.