9 заковыристых вопросов и задачек из собеседования по JavaScript
easy

9 заковыристых вопросов и задачек из собеседования по JavaScript

Попробуйте ответить на все

Задача рекрутера на собеседованиях на джуниор-разработчиков — понять, можете ли вы программировать на JavaScript на начальном уровне и как вы справляетесь с нестандартными вопросами. Сегодня — 9 реальных вопросов с собеседований, которые задают новичкам. Попробуйте справиться со всеми, и, если получится, — поздравляем, вы готовы к настоящему собеседованию.

Как очистить такой массив: var arrayList = ['п', 'р', 'и', 'в', 'е', 'т']

Чем больше способов назовёте — тем лучше. Под катом — три способа, попробуйте найти четвёртый.

Вариант 1:

arrayList = [];

Таким образом переменной arrayList задаётся новый пустой массив. Это решение подойдёт, если в других местах кода нет ссылок на исходное значение arrayList.

Вариант 2:

arrayList.length = 0;

Такой код очищает существующий массив arrayList, устанавливая его длину как 0. Это решение подходит, если нужно обновить все ссылочные переменные, которые указывают на исходный массив arrayList. 

Вариант 3:

arrayList.splice(0, arrayList.length);

Очистка массива таким образом также обновит все ссылки на исходный массив arrayList.

Как проверить, что число — целое?

Целое — это значит, что у него нет дробной части, которая идёт после запятой. Например, число 5 — целое, а 8,6 — нет, потому что у него есть дробная часть.

Самый простой способ узнать, что число целое, — проверить, есть ли остаток при делении числа на 1.

x = 10;
if (x % 1 == 0) { console.log ('Число целое')}
else {console.log ('Число не целое')}

Объясните, что такое функция обратного вызова (callback), и приведите простой пример

Функция обратного вызова — это функция, которая передаётся в качестве аргумента другой функции и выполняется после завершения операции.

Вот пример простой функции обратного вызова:

function modifyArray(arr, callback) {
  arr.push(100);
  callback();
  }
  var arr = [1, 2, 3, 4, 5];
  modifyArray(arr, function() { console.log("Массив изменён", arr); });

Как проверить, что две строки являются анаграммами друг друга?

Анаграмма строки — это другая строка, которая содержит такие же символы, но в другом порядке. Например, "абвг" и "бгва" — это анаграммы.

В решение можно добавить «защиту от дурака» — сделать так, чтобы регистр символов (большие и маленькие буквы) не влиял на работу кода. Если этого не сделать, то первая заглавная буква в первой строке может всё испортить: во второй строке она будет стоять последней и быть маленькой, а не большой.

var firstWord = "Логика";
var secondWord = "Иголка";
isAnagram(firstWord, secondWord); // два слова являются анаграммами
function isAnagram(first, second) {
   // Чтобы избавиться от чувствительности к регистру, сделаем все буквы строчными
   var a = first.toLowerCase();
   var b = second.toLowerCase();
   // Отсортируем строки и соединим полученный массив со строкой. Сравним результаты
   a = a.split("").sort().join("");
   b = b.split("").sort().join("");
   return a === b;
}

Что выведет этот код?

Подумайте хорошо, прежде чем отвечать.

var y = 1;
if (function f() {}) {
  y += typeof f;
}
console.log(y);

Этот код выведет «1undefined».

В условном операторе мы описываем пустую функцию — function f() {}. С описанием всё в порядке, и функция определена корректно, поэтому мы получаем true, а значит — переходим к тому, что делает условный оператор. А вот там уже мы пытаемся получить тип объекта f, но проблема в том, что он определён в условии и не виден внутри фигурных скобок. Его область видимости — условие, которое мы уже проверили, и дальше эта функция нигде не видна, поэтому к единице добавляется сообщение, что переменная не определена.

Что выведет этот код?

Вопрос про область видимости с подвохом.

(function() {
   var a = b = 5;
})();
console.log(b);

Этот код вернёт число 5. 

Выражение var a = b = 5; читается как var a = b; b = 5;, поэтому в переменной b будет храниться пятёрка. А подвох тут в том, что хоть эта переменная и была объявлена только внутри функции, но JavaScript всё равно может иногда получать доступ к таким локальным переменным — это называется «поднятие» переменных, или hosting.

Что выведет этот код?

Вопрос на понимание стека вызовов.

for (var i = 0; i < 4; i++) {
  setTimeout(() => console.log(i), 0)
}

На экране будут четыре четвёрки.

Здесь классическая ловушка с нулевыми задержками. Дело в том, что setTimeout(callback, 0) не означает, что обратный вызов функции сработает через ноль миллисекунд.

Вот что происходит тут на самом деле:

  1. Текущий стек вызовов установлен на первый setTimeout().
  2. windows.setTimeout() — это веб-API, и он не блокирует ввод-вывод при работе с функциями. Это значит, что через 0 миллисекунд наша анонимная функция будет отправлена в очередь, а не в стек вызовов. А в очереди она подождёт, пока основная программа не закончит свои дела и не вернётся к очереди.
  3. Поскольку стек вызовов свободен, цикл for может продолжиться до второго setTimeout(), потом до третьего и до четвёртого.
  4. Теперь цикл завершён, и i равно 4. Теперь JS может выполнять очередь вызовов один за другим. В итоге каждый console.log(i) выведет 4.

Как проверить, что строка является палиндромом?

Палиндром — это слово, фраза или другой тип строки, который читается одинаково слева направо и наоборот. К примеру, слова «потоп» и «Анна» — это палиндромы. А слова «Код» и «журнал» — не палиндромы, поскольку не читаются одинаково от начала до конца и от конца до начала.

Простое решение — перевести всё в один регистр, перевернуть слово и сравнить его с исходным.

const palindrome = str => {
  // переводим строку в нижний регистр
  str = str.toLowerCase()
  // переворачиваем входную строку и возвращаем результат
  // сравниваем результаты
  return str === str.split('').reverse().join('')
}

Как посчитать все гласные в строке?

const findVowels = str => {
  let count = 0
  const vowels = ['а', 'я', о', 'ё', 'у', 'ю', 'э', 'е', 'и', 'ы']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy