Недавно прочитал неплохой пост на тему поиска работы QA и подумал, что похожий пост был бы полезен для JavaScript разработчиков. В конечном счёте, веб движется вперед семимильными шагами, и соискателей на позицию JavaScript программиста хоть отбавляй (разумеется, хороших всегда меньше).
Я очень хочу уйти от бессмысленной демагогии на тему «это обязательно знать, а это нет», поэтому свою статью я построю вокруг самых популярных вопросов-ответов (по опыту собственных собеседований, и собеседований, в которых я выступал собеседующей стороной), который случались за время моей профессиональной практики.
Вопросы, относящиеся к общим знаниям в области JavaScript
ООП в JavaScript. Один из самых популярных вопросов, на мой взгляд. Время от времени можно услышать вариации а-ля «Что такое прототипное наследование», «Инкапсуляция в JavaScript». Информацию можно найти тут или тут.
Утечки памяти в JS. Огромная тема, можно минут 10 рассказывать, мне кажется. Самым лаконичным примером я считаю var a = {}; a.a = a;
. Такой код создаст утечку в IE <= 7 версии, т.к. осёл до 8 версии не умеет чистить циклические зависимости. Должно хватить для простой демонстрации понимания механизма работы с утечками. Далее будут вопросы а-ля «Как создать утечку, используя фреймворк N». В деталях можно прочитать тут.
Замыкания в JS. Нет, ну правда, какое собеседование без вопроса о замыканиях? Вопрос отчасти относится к предыдущему («Инкапсуляция в JavaScript»), но чаще всего рассматривается отдельно.
Самовызывающиеся функции. Тоже весьма частый вопрос на собеседованиях. Ещё иногда подходят к этому со стороны jQuery: «Почему все плагины обособлены в конструкцию (function() {})();
?».
Область видимости переменных. Ключевое слово «this». Да и, честно говоря, всё, что связано с баблингом переменных и функций. Мол, чем отличается запись var a = function() {};
от записи function a() {};
. Рассказать про this.
Как поменять контекст функции. Частичное применение функции. Ну, тут можно оставить без комментариев, всё упирается в знание разницы между .call
, .apply
и .bind
и некоторых стандартных решений на уровне языка. Обо всём этом можно прочитать в одной замечательной статье.
Производительность циклов. Иногда (но далеко не всегда) такой вопрос имеет место. Лично мне он нравится. По крайней мере, человек должен знать, почему for
быстрее, чем Array.prototype.forEach
. Но желательно ознакомиться с информацией из этой статьи.
На этом, как правило, стандартные вопросы заканчиваются. Дальше идут вопросы, касательно специфики вакансии. Я имею ввиду, более «профильные» для компании. Например, если требуется JS разработчик со знанием Backbone/Marionette(Chaplin), то следующий блок вопросов будет про jQuery, underscore/lodash и прочие связанные технологии, как бы очевидно это не звучало. Вопросов по данным тематикам море, но парочку любимых я всё-таки приведу:
Вопросы, относящиеся к jQuery
Почему перед исходным кодом jQuery стоит восклицательный знак?
Расскажите про $.Deferred. Могу посоветовать одно: кроме знания $.Deferred, было бы неплохо упомянуть о нативных Promise'ах
Как создать утечку памяти с помощью jQuery.
Я люблю простые примеры, поэтому обычно привожу следующее:
var jqSelector = $("#selector"),
nativeSelector = document.getElementById("selector");
// Удаляем элемент "нативным" способом
nativeSelector.parentNode.removeChild(nativeSelector);
// Выводим закешированное значение селектора jQuery
console.log(jqSelector); // Привет, jQuery.cache!
А вообще, в части вопросов о нативном JS уже было похожее, и там же приведена ссылка на примеры с использованием jQuery.
jQuery.extend. Рассказать всё про функцию, возможно попросят написать аналог. Кстати, возможно будет полезно прочитать статью про примеси в JS.
Составьте AJAX-запрос на сервер, используя jQuery. Не особо популярный вопрос, но если спрашивать нечего, спросят что-то вроде него. Разумеется, вы должны знать, как использовать функции $.ajax
, $.get
, $.post
и устанавливать настройки в $.ajaxSettings
. Всё это уже давно есть на хабре.
Остальные вопросы скорее «для массовки», я считаю, что о jQuery больше нечего спрашивать. Конечно, будут ещё вопросы типа «Как добавить класс к объекту, используя jQuery», но я думаю, это не будет неожиданностью и не вызовет проблем.
Вопросы, относящиеся к Underscore/Lodash
Такие встречаются, честно говоря, очень редко. Но всё же, приведу краткий список того, что я могу вспомнить:
Чем _.throttle отличается от _.debounce. Опять же, ответ есть на хабре.
Как работает функция _.extend. Аналог вопроса про jQuery.extend, ссылка на доку выше.
Расскажите о шаблонизаторе Underscore. Кстати, не исключено, что это только начало, и вас будут спрашивать про шаблонизатор jQuery и все остальные. Я бы советовал хоть одним глазом прочитать эту статью.
Loadsh vs Underscore. Вопрос для разведения холивара на собеседованиях
Что дальше?
А дальше специальные вопросы, касательно фреймворков и библиотек, которые использует компания в своих проектах. Обычно, больше всего ценятся ответы на вопросы из категории «нативного» JS, да ведь оно и не мудрено: технологии появляются и исчезают, и совсем не удивительно, если программист о чём-то не слышал, но но ответы на эту категорию вопросов показывают, как быстро человек может изучить и понять, как работает та или иная библиотека/фреймворк.
Разумеется, если вам есть, что добавить к этой статье — пишите в лс, я обязательно дополню её вашей информацией.
Автор: xamd