Если вы квалифицируетесь как старший разработчик JavaScript, скорее всего, вам будут задавать сложные вопросы во время собеседований по программированию.
Я знаю, что это несправедливо. Какой-то неизвестный человек осматривает вас с ног до головы в углу, словно желая увидеть, из чего вы сделаны. Это был неприятный опыт.
что ты можешь сделать?
Следуйте этому совету: «Практика делает совершенным». Потратив достаточно времени и на регулярной основе лучше понимая JavaScript, вы улучшите свои навыки кодирования и, попутно, свои навыки прохождения собеседований.
В этой статье вы найдете 7 вопросов для собеседования по JavaScript, которые на первый взгляд кажутся простыми, но на самом деле сложны.
Хотя на первый взгляд эти вопросы кажутся случайными, они пытаются связать важные концепции JavaScript. Так что лучше потренируйтесь перед следующим собеседованием!
1. Неожиданная глобальная переменная
проблема
В следующем кодеtypeof a
иtypeof b
Каковы значения:
function foo() {
let a = b = 0;
a++;
return a;
}
foo();
typeof a; // => ???typeof b; // => ???
Отвечать
Рассмотрим подробнее строку 2:let a = b = 0
. Этот оператор объявляет локальную переменнуюa
. Тем не менее, он объявляетГлобальныйПеременнаяb
.
существуетfoo()
Переменная не объявлена ни в области видимости, ни в глобальной области видимостиb
Таким образом, JavaScript преобразует выражениеb = 0
Интерпретируется какwindow.b = 0
.
b
случайно созданная глобальная переменная.
В браузере приведенный выше фрагмент кода эквивалентен следующему:
function foo() {
let a; window.b = 0; a = window.b; a++;
return a;
}
foo();
typeof a; // => 'undefined'
typeof window.b; // => 'number'
typeof a
Да 'undefined'
. Переменнаяa
только при foo()
Объявление в области действия, недоступное во внешней области.
typeof b
равный'number'
.b
является значением0
глобальных переменных.
2. Свойство длины массива
проблема
clothes[0]
В чем ценность:
const clothes = ['jacket', 't-shirt'];
clothes.length = 0;
clothes[0]; // => ???
Отвечать
объект массиваlength
собственность имеетособое поведение:
уменьшать
length
Значение свойства имеет побочный эффект удаления элементов с индексами между старыми и новыми значениями длины.
так как length
это поведение при выполнении javascriptclothes.length = 0
, массивclothes
Все элементы в удалены.
clothes[0]
Даundefined
,так как clothes
Массив очищается.
3. Тест Соколиного Глаза
проблема
numbers
Каково содержимое массива:
const length = 4;
const numbers = [];
for (var i = 0; i < length; i++);{
numbers.push(i + 1);
}
numbers; // => ???
Отвечать
Давайте подробнее рассмотрим, что появляется в открывающей фигурной скобке.{
предыдущая точка с запятой;
:
Точку с запятой легко игнорировать, и она создаетпустой оператор. Пустой оператор — это оператор, который ничего не делает.
for()
зациклился 4 раза по пустому оператору (ничего не делая), игнорируя блок кода, который фактически добавил элемент в массив{ numbers.push(i + 1); }
.
Приведенный выше код эквивалентен:
const length = 4;
const numbers = [];
var i;
for (i = 0; i < length; i++) {
// does nothing
}
{
// a simple block
numbers.push(i + 1);
}
numbers; // => [5]
for()
Инкрементная переменнаяi
до того как4
. Затем JavaScript входит в блок кода{ numbers.push(i + 1); }
,будет4 + 1
добавить вnumbers
в массиве.
такnumbers
это [5]
.
Моя история за этим вопросом
Мне задали этот вопрос давным-давно, когда я проходил собеседование на свою первую работу. Во время интервью меня попросили ответить на 20 вопросов по программированию за 1 час. Среди них есть вопросы с пустыми заявлениями. Я не вижу запятую, когда исправляю это в спешке
;
прямо в фигурных скобках{
спереди. Так что я ошибся как [1,2,3,4] Я немного разочарован этими несправедливыми трюками. Я спросил у интервьюера, почему они это сделали? «Потому что нам нужны люди, которые обращают внимание на детали». К счастью, я не стал работать в этой компании.
Что вы думаете об этом вопросе?
4. Автоматически вставлять точки с запятой
проблема
arrayFromValue()
Какое значение возвращается?
function arrayFromValue(item) {
return
[item];
}
arrayFromValue(10); // => ???
Отвечать
легко игнорироватьreturn
ключевые слова и[items]
Разрыв строки между выражениями.
Обертка делает JavaScript автоматическиreturn
и[items]
Вставьте точку с запятой между выражениями.
Вот эквивалентный фрагмент кода, который работает вreturn
Вставьте точку с запятой после:
function arrayFromValue(item) {
return; [items];
}
arrayFromValue(10); // => undefined
в функцииreturn;
заставить его вернутьсяundefined
.
следовательноarrayFromValue(10)
Значениеundefined
.
Проверятьэта статьяУзнайте больше об автоматической вставке точки с запятой.
5. Классическая проблема: дерьмовое закрытие
проблема
Что выведет в консоль следующий скрипт:
let i;
for (i = 0; i < 3; i++) {
const log = () => {
console.log(i); }
setTimeout(log, 100);
}
Отвечать
Если вы раньше не слышали об этом каверзном вопросе, ваш ответ, скорее всего,0
, 1
и2
, это не правильно. Когда я впервые попытался ответить на него, мой ответ был таким же!
Выполнение этого фрагмента кода состоит из двух шагов.шаг 1
-
for()
Повторить 3 раза. На каждой итерации создается новая функцияlog()
, который фиксирует переменнуюi
. потомsetTimout()
воплощать в жизньlog()
. - когда
for()
Когда цикл завершится,i
Значение переменной3
.
log()
является переменной захватаi
закрытие, которое находится вfor()
Определение внешней области цикла. Важно понимать, что замыкания захватывают лексическиПеременнаяi
.Шаг 2
Шаг 2 происходит через 100 мс:
setTimeout()
3 в очереди были вызваныlog()
Перезвони.log()
чтение переменнойi
изТекущее значение,Сейчас3
и войдите в консоль3
.
Вот почему вывод консоли3
, 3
и3
.
Вы знаете, как сделать вывод кода0
, 1
, и2
? Пожалуйста, напишите ваше предложение в комментариях.
6. Проблема с плавающей запятой
проблема
Каков результат теста на равенство?
0.1 + 0.2 === 0.3 // => ???
Отвечать
Во-первых, давайте посмотрим0.1 + 0.2
Значение:
0.1 + 0.2; // => 0.30000000000000004
0.1
и0.2
иточно не равно 0.3
, но немного больше, чем0.3
.
Такие операции, как сложение чисел с плавающей запятой, подвержены ошибкам округления из-за того, как числа с плавающей запятой кодируются в двоичном формате.
Проще говоря, прямое сравнение чисел с плавающей запятой неточно.
следовательно0.1 + 0.2 === 0.3
Даfalse
.
Проверять0.30000000000000004.comПолучите больше информации.
7. Переменный подъем
проблема
при доступе до объявленияmyVar
иmyConst
Что случится?
myVar; // => ???myConst; // => ???
var myVar = 'value';
const myConst = 3.14;
Отвечать
Подъем переменных и временная мертвая зона — две важные концепции, влияющие на жизненный цикл переменных JavaScript.
Посещение перед заявлениемmyVar
Результатundefined
. приподнятыйvar
Переменная перед своей инициализацией имеетundefined
значение .
Однако доступ до объявленияmyConst
броситReferenceError
. в строке объявленияconst myConst = 3.14
До,const
Переменная находится во временной мертвой зоне.
Посмотреть руководствоОбъяснение подъема переменных JavaScript, полностью понять концепцию переменного продвижения.
8. Думай
Вы можете возразить, что некоторые вопросы бесполезны для интервью. Я чувствую то же самое, особенно в отношенииТест орлиного глаза. Тем не менее, некоторые люди будут задавать эти вопросы.
В любом случае, большинство из этих вопросов могут проверить ваше знакомство с JavaScript. Если у вас возникли проблемы с ответом на некоторые из этих вопросов при чтении этой статьи, вот подсказка о том, что следует изучить дальше!
Справедливо ли задавать сложные вопросы на собеседовании? Дайте свое мнение.
общаться
Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat «Станция перевода 1024», чтобы предоставить вам больше технических сухих товаров!