Задачки с собеседований

У меня большой опыт технических собеседований, а сейчас иногда приходится делать технический скрининг кандидатов (ака собеседование) для наших заказчиков в New.HR. За 15 лет разработки повидал, как говорится, всякого и накопил опыт. И вот за эти годы у меня собралось большое количество разных простых задачек с “подвохом” на знание особенностей работы разных ЯП. Решил, что ими стоит делиться постепенно. Те, кто не знал — узнают что-то новое. Те кто не поймет — вряд ли заучит и на собеседовании есть 101 способ проверить помнит человек или понимает. Так что я не боюсь выкладывать их тут. Более того, не стоит меня упрекать в том, что я даю ответы. Ответы ленивые всегда нагуглят. Ответы будут в конце. Задачки будут не только на JS, но так же на PHP, Rust, Java, Kotlin, Bash.


В свое время зачитывался книгой Cracking Coding Interview. Так вот это будет моя версия Cracking Coding Interview.

В этой серии, которую я буду называть Fun ES буду разбирать задачки из мира фронтенда, будет много именно FuzzBuzz задачек. Сейчас опустим сторону зачем они нужны. Они точно нужны, но собеседование не должно состоять только из таких задач. Их точно встретите в большинстве компаний, как крупных так и стартапов, как российских так и зарубежных (а мы так же работаем с европейскими, израильскими и американскими заказчиками). Вы удивитесь, но таких задачек в зарубежных компаниях достаточно. И судят там строже, порой. И лайвкодинг жестче (бывает даже в гуглдоксе в режиме колобарации). И никакие оправдания: а я в работе такое не буду применять — никого не устроят. И время на решение порой ограничивается парой минут.

Задачка

Простой вопрос на знание апишечки:

// 1. Что делает этот код?
Array(3).fill(3);

Ответив на этот вопрос (думаю что даже не зная что это можно догадаться), переходим к вопросу, что будет здесь:

// 2
[1, 2, 3].fill(3);

И финально накидываем козырь, что будет в этом случае:

var arr = Array(3).fill({});
arr[0][1] = 1;
console.log(arr);

Ответы

  1. Все просто — создаем массив из 3х элементов undefined и заполняем их тройками: [3,3,3]
  2. Берем массив чисел и переписываем все элементы на 3: [3,3,3]
  3. А вот тут уже вопрос с “подвохом”, если не знать про передачу объектов по ссылке. Мы создадим массив из 3х элементов undefined и заполним его объектом — {}. Но объект не будет склонирован, а будет передана ссылка на него. Таким образом ответ:
[{1:1},{1:1},{1:1}]

И да, это массив объектов, а не матрица. И тут можно уточнить про нотацию доступа к полям объекта.

После того как с этим разобрались, я бы спросил как исправить этот “баг-фичу”? Тут есть полет для фантазии и рассуждений. Разбирать не будем, но в комментах можете показать свои варианты.

На этом первая статья из рубрики “Задачи с собеседований” окончена. Напишите в комментарии интересен ли вам такой цикл статей и стоит ли продолжать?