7 простых вопросов для собеседования по JavaScript, 3 месяца без найма человека

JavaScript

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

Я знаю, что это несправедливо. Какой-то неизвестный человек осматривает вас с ног до головы в углу, словно желая увидеть, из чего вы сделаны. Это был неприятный опыт.

image.png

что ты можешь сделать?

Следуйте этому совету: «Практика делает совершенным». Потратив достаточно времени и на регулярной основе лучше понимая 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.

image.png

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; // => ???

Отвечать

Давайте подробнее рассмотрим, что появляется в открывающей фигурной скобке.{предыдущая точка с запятой;:

image.png

Точку с запятой легко игнорировать, и она создаетпустой оператор. Пустой оператор — это оператор, который ничего не делает.

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);
}

Отвечать

Если вы раньше не слышали об этом каверзном вопросе, ваш ответ, скорее всего,01 и2, это не правильно. Когда я впервые попытался ответить на него, мой ответ был таким же!

Выполнение этого фрагмента кода состоит из двух шагов.шаг 1

  1. for()Повторить 3 раза. На каждой итерации создается новая функцияlog(), который фиксирует переменнуюi. потомsetTimout()воплощать в жизньlog().
  2. когдаfor()Когда цикл завершится,iЗначение переменной3.

log()является переменной захватаiзакрытие, которое находится вfor()Определение внешней области цикла. Важно понимать, что замыкания захватывают лексическиПеременнаяi.Шаг 2

Шаг 2 происходит через 100 мс:

setTimeout()3 в очереди были вызваныlog()Перезвони.log()чтение переменнойiизТекущее значение,Сейчас3и войдите в консоль3.

Вот почему вывод консоли33 и3.

Вы знаете, как сделать вывод кода01, и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.

image.png

Посещение перед заявлениемmyVarРезультатundefined. приподнятыйvarПеременная перед своей инициализацией имеетundefinedзначение .

Однако доступ до объявленияmyConstброситReferenceError. в строке объявленияconst myConst = 3.14До,constПеременная находится во временной мертвой зоне.

Посмотреть руководствоОбъяснение подъема переменных JavaScript, полностью понять концепцию переменного продвижения.

8. Думай

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

В любом случае, большинство из этих вопросов могут проверить ваше знакомство с JavaScript. Если у вас возникли проблемы с ответом на некоторые из этих вопросов при чтении этой статьи, вот подсказка о том, что следует изучить дальше!

Справедливо ли задавать сложные вопросы на собеседовании? Дайте свое мнение.

оригинальный

общаться

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat «Станция перевода 1024», чтобы предоставить вам больше технических сухих товаров!

公众号:1024译站