Загрузка…
Загрузка…
frontend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
—
01
Код
Реализуйте у стандартного объекта Number метод times: он принимает колбэк и вызывает его столько раз, каково число, на котором метод вызван, передавая в колбэк индекс очередной итерации (например, (3).times(cb) выведет 0, 1, 2).
Лайвкодинг, разрешили писать на ES8 (восьмая спецификация).
02
Теория
Какие краевые случаи нужно обработать в реализации Number.prototype.times (отрицательное число, нецелое/дробное число, проверка что переданный аргумент — функция)?
Follow-up к задаче про метод times.
03
Теория
Как проверить, что число является целым?
Follow-up к задаче про times; ожидаемый ответ — Number.isInteger.
04
Код
Напишите функцию sumPromises, которая принимает произвольное количество промисов (каждый резолвится в число и никогда не реджектится), дожидается результатов их выполнения и возвращает новый промис, который резолвится суммой результатов.
Заметки
Транскрипт видео-эксперимента: джуниор без опыта проходит собеседование в Яндекс на позицию мидл фронтенд-разработчика. Секция лайвкодинга на JavaScript из пяти задач (Number.prototype.times, сумма промисов, декоратор с лимитом вызовов, промисификация колбэк-функции + retry, обход дерева) с теоретическими врезками и follow-up'ами по ходу решения. Результат собеседования в транскрипте не озвучен.
Стиль интервьюера
Интервьюер доброжелательный, явно поощряет рассуждения вслух («принесёт дополнительный балл»), подсказывает и наводит на ответ, после каждой задачи обсуждает краевые случаи и задаёт теоретические follow-up'ы; мелкие ошибки в коде указывает мягко (опечатка в операторе присваивания, naming в стиле Java); в конце оставил время на вопросы кандидата.
05
Теория
Что будет, если не указать начальное значение (initialValue) вторым аргументом у Array.prototype.reduce?
Follow-up к задаче sumPromises; если не указать — начальным значением станет первый элемент массива.
06
Код
Напишите функцию-декоратор callLimit(fn, limit, callback?): она возвращает новую функцию, которая при вызове вызывает обёрнутую fn с теми же аргументами не более limit раз; опциональный третий аргумент — колбэк без аргументов, вызываемый при последнем (лимитном) вызове; у возвращаемой функции должен быть метод сброса счётчика вызовов.
07
Теория
Чем метод apply отличается от call?
Follow-up к задаче callLimit — кандидат использовал apply в решении.
08
Теория
Чем метод bind отличается от call и apply?
Follow-up: bind создаёт новую функцию, которую нужно вызвать отдельно, а не вызывает сразу.
09
Теория
Чем оператор == отличается от ===?
Follow-up: кандидат использовал в коде оба варианта; == сравнивает с приведением типов, === без.
10
Код
Дана синхронная функция, сообщающая результат через error-first колбэк (первым аргументом ошибка или null, вторым — данные). Напишите функцию, которая промисифицирует её: возвращает промис, резолвящийся данными или реджектящийся ошибкой.
Первая часть двухчастной задачи.
11
Код
Напишите функцию-обёртку (retry) над промисифицированной функцией: вызвать внутреннюю функцию, при успехе вернуть результат; при ошибке совершить ещё N дополнительных попыток; если все попытки провалились — вернуть промис, отклонённый последней ошибкой.
Вторая часть задачи на промисификацию; кандидат предложил варианты через цикл с try/catch и через .catch.
12
Теория
Как вернуть (пробросить) ошибку из .catch-обработчика промиса? Назовите два способа.
Follow-up: ожидаемые ответы — return Promise.reject(...) и throw внутри обработчика.
13
Код
Дано дерево узлов (узел: { name, type: 'squirrel' | ..., branches?: массив таких же узлов }). Напишите функцию, которая обходит дерево и возвращает массив имён всех узлов с типом «белка» (порядок имён не важен).
Кандидат решил рекурсивным обходом.
14
Теория
Какие проблемы есть у рекурсивных решений и почему некоторые предпочитают их избегать?
Follow-up к задаче на обход дерева: переполнение стека вызовов, а также расход памяти из-за замыканий/фреймов стека.
15
Теория
Как избежать рекурсии при обходе дерева (итеративный обход с использованием массива как стека/очереди)? Можно ли с тем же массивом сделать и DFS, и BFS?
Follow-up: массив как очередь даёт BFS, как стек — DFS.
16
Теория
Когда при обходе дерева BFS предпочтительнее DFS? Как может выглядеть задача, в которой DFS вообще не применим (например, найти ближайший узел)?
Follow-up: ответ — поиск ближайшего узла требует обхода в ширину.