Задача рекрутера на собеседованиях на джуниор-разработчиков — понять, можете ли вы программировать на 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) не означает, что обратный вызов функции сработает через ноль миллисекунд.
Вот что происходит тут на самом деле:
- Текущий стек вызовов установлен на первый setTimeout().
- windows.setTimeout() — это веб-API, и он не блокирует ввод-вывод при работе с функциями. Это значит, что через 0 миллисекунд наша анонимная функция будет отправлена в очередь, а не в стек вызовов. А в очереди она подождёт, пока основная программа не закончит свои дела и не вернётся к очереди.
- Поскольку стек вызовов свободен, цикл for может продолжиться до второго setTimeout(), потом до третьего и до четвёртого.
- Теперь цикл завершён, и 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
}