Каверзные вопросы и задачи по JavaScript из собеседований

2
20764
Добавить в избранное

Представляем вашему вниманию статью, в которой собраны каверзные вопросы и задачи по JavaScript с собеседований от Google и Amazon.

Статья ориентирована на начинающих и junior-разработчиков. Однако наверняка каждый человек, использующий JS, найдёт в этой подборке что-нибудь интересное для себя.

К задачам по JavaScript прилагаются объяснение и реализация.

по JavaScript

Задачи по JavaScript:

Напишите функцию, которая будет проходить через массив целых чисел и выводить индекс каждого элемента с задержкой в 3 секунды.

Самое популярное и неправильное решение разработчиков JavaScript выглядит следующим образом:

В данном случае код будет выводить “Index: 4, element: undefined” (повторится 4 раза). Это происходит потому, что функция setTimeout является внутренней (вложенной) функцией, которая имеет доступ к переменным внешней функции. Во внешней функции есть цикл for, в котором инициализируется переменная i — индекс для прохода по массиву. Через 3 секунды выполняется код функции, выводится значение i, которое на конец цикла равно 4, потому что оно проходит через 0, 1, 2, 3, 4 и останавливается на 4.

Чтобы выполнить задание, необходимо быть знакомым с замыканием функцийвнутренним таймером и областью видимости.

Правильная реализация выглядит примерно так:

Или так:

Реализуйте каррирование (англ. currying).

Прежде всего, что такое каррирование в JavaScript? Это приём в функциональном программировании, позволяющий преобразовать функцию, заменив её несколько первых аргументов константными значениями, тем самым создав новую функцию с меньшим количеством аргументов на основе старой. Помогает писать более чистый и элегантный код.

Пример использования:

В данном примере, используя каррирование, вы прибавляете новое число к уже заданному.

Реализация поставленной задачи:

Вы можете применить каррирование к прототипу функции. Если нет аргументов для каррирования, вы просто возвращаете текущую функцию. Если есть аргументы, то переходите к следующим шагам:

  • Объедините старые аргументы с новыми, используя args.concat(toArray(arguments))
  • Передайте все аргументы в функцию, используя apply

Использование:

Передайте аргументы в метод function.curry. Возвратится функция. Используйте её для дальнейшего каррирования.

Вопросы по JavaScript:

Как бы вы могли использовать Math.max для нахождения максимального элемента в массиве?

Метод Math.max() возвращает наибольшее из нуля или более чисел. Используем  метод Function.prototype.apply() для нахождения максимального элемента в числовом массиве. Вызов getMaxOfArray([1, 2, 3]) эквивалентен вызову Math.max(1, 2, 3), однако вы можете использовать функцию getMaxOfArray() вместе с программно сконструированными массивами любого размера.

Как бы вы сравнили два объекта в JavaScript?

Используем Lodash. Среди его функций есть isEqual(), которая насильно проверяет каждое значение ключа, используя ECMAScript5 и собственную оптимизацию, если они доступны в браузере.

В чем разница между собственными объектами и объектами хоста?

Объекты хоста: объекты типа windowXmlHttpRequest, узлы DOM и т. д., предоставляющиеся средой браузера. Они отличаются от встроенных объектов, потому что не все окружения имеют одинаковые объекты хоста. Если JavaScript работает за пределами браузера, например, на языке сценариев на стороне сервера, например, в Node.js, будут доступны разные объекты хоста.

Объекты пользователя: объекты, определенные в JavaScript-коде. Таким образом, инициализированная переменная в вашем коде будет объектом пользователя.

(function() {*code*})(); Для чего используется такая конструкция? Напишите несколько примеров создания.

Это называется Immediately-Invoked Function Expression (IIFE) функцией, которая вызывается сразу после создания. Используется для того, чтобы некоторые переменные не попали во внешнее окружение. Также используется для создания локального замыкания.

Примеры создания:

С помощью какой конструкции можно управлять потоком выполнения скрипта  и отслеживать ошибки?

Это возможно с помощью try{}...catch{}

Правда/ложь

В этой части статьи будет задано 10 вопросов, на которые нужно однозначно ответить: ложно утверждение или нет.

Вопрос: 'false' ложно?
Ответ: Нет, т.к. только пустая строка является ложной.

Вопрос: ' ' ложно?
Ответ: Эта строка не является пустой, т.к. в ней есть пробел. Из этого следует, что ‘ ‘ не ложно.

Вопрос: Что насчёт {} ?
Ответ: Истинно, т.к. это объект. Объект без свойств не может быть ложным.

Вопрос: Что можете сказать о [] ?
Ответ: Это выражение также истинно, т.к. это объект массива.

Вопрос: Если вы утверждаете, что » (пустая строка) является ложным утверждением, тогда что насчёт newString(' ')? // newString(пустая строка)
Ответ: Несмотря на то, что вы передаёте пустую строку в string constructor, конструктор создаёт объект string. Точнее, экземпляр объекта string. Он становится объектом. Следовательно, это не ложь.

Вопрос:  Что можете сказать о newBoolean(false) ?
Ответ: Истинно, потому что конструктор создаёт экземпляр объекта boolean, который является объектом.

Вопрос: Boolean(function(){})
Ответ: true, если вы передадите истинное значение в Boolean.

ВопросBoolean(/foo/)
Ответ: true

Вопрос: true % 1
Ответ: 0. Если вы хотите найти остаток от true, true становится единицей, а остаток от деления единицы на единицу равен 0.

Вопрос: ‘ ‘ % 1 //пустая строка % 1
Ответ: 0

Статьи по теме:

Готовитесь к собеседованию?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Добавить комментарий