Ниже представлены вопросы по теме Javascript (источник), которые часто задают на собеседовании. Прочитав вопрос, постарайтесь ответить на него так, как бы вы сделали это во время своего интервью. Под вопросом вы найдете ответ и ссылку на источники раскрывающие тему подробнее.
1) Опишите приём делегирования событий в JS.
Подробнее тут:
2) Опишите, как работает this в JavaScript? Приведите пример того, как работа с this изменилась в ES6.
function getName() {
return this.name;
}
var sally = { name: ‘Sally’};
getName.call(sally); // Sally
var megan = { name: ‘Megan’};
getName.call(megan); // ‘Megan
Здесь функция getName ничего не знает об объекте в контексте которого
она будет вызвана, тем не менее, превосходно выполняет свою обязаность.
Важный момент: контекст выполнения привязывается в момент вызова функции
(строка getName.call(sally)). В ES6 была добавлена стрелочная функция,
контекст выполнения которой устанавливается не в момент вызова функции, как
в примере выше, а в момент определения самой функции.
var getName = () => {
return this.name;
}
var sally = { name: 'Sally'};
getName.call(sally); // undefined
Тут получаем undefined вместо имени, так как функция определена в глобальном скоупе, а в нестрогом режиме, в момент
определения стрелочной функции, ее this будет указывать на window (в
браузере). В window переменная name не определена, отсюда undefined. Явное определение
контекста вызова (.call()) со стрелочными функциями не работает.
Подробнее тут:
3) Опишите, как работает прототипно-ориентированная модель наследования в JS.
При попытке получить доступ к какому-либо свойству объекта, свойство вначале ищется в самом объекте, затем в цепочке прототипов. Поиск ведется до тех пор, пока не найдено свойство с совпадающим именем или не достигнут конец цепочки прототипов.В плане наследования JavaScript работает лишь с одной сущностью: объектами. Каждый объект имеет внутреннюю ссылку на другой объект, называемый его прототипом. У объекта-прототипа также есть свой собственный прототип и так далее до тех пор, пока цепочка не завершится объектом, у которого свойство prototype равно null. По определению, null не имеет прототипа и является завершающим звеном в цепочке прототипов.
4) В чем разница между значениями: null, undefined или undeclared? Как бы вы реализовали проверку на эти значения?
undefined — неопределенное значение
undeclared — переменная не была объявлена, вызов ее вызовет ошибку, вызов typeof покажет undefined (для реализации проверки). Для тестовой переменной «a», проверка может быть реализована следующим образом:
typeof a !== 'undefined' && Boolean(a)
5) Что такое замыкание в JS, и как/для чего его используют?
Подробнее тут:
6) Какие конструкции языка вы используете для перебора свойств объекта и элементов массива?
Подробнее тут:
7) Опишите основное различие между методами Array.forEach () и Array.map (), в каких случая вы бы применили каждый из них?
Подробнее тут:
8) Для чего используют анонимные функции в JS ?
9) В чем заключается различие между host objects и native objects ?
Host objects— объекты, чья роль заключается в создании исполнительного окружения для ECMAScript, например, window, document, location, history.
Подробнее тут:
10) В чем заключается различие между Function Declaration и Function Expression в JavaScript?
function sum(a, b) {
return a + b;
}
Function Expression (функциональное выражение) — альтернативный
синтаксис для объявления функции.
var sum = function(a, b) {
return a + b;
}
По сути, они делают одно и тоже, но функции, объявленные как
Function Declaration могут быть вызваны раньше их места объявления в
коде (hoisting), а Function Expression нет.
sum(2, 4);
function sum(a, b) {
return a + b;
}
Подробнее тут:
11) Опишите, что делают Function.call и Function.apply. В чем заключается основное различие между ними ?
Подробнее тут:
12) За что отвечает Function.prototype.bind ?
Подробнее тут:
13) За что отвечают и в чем заключается различие между feature detection, feature inference и User Agent String ?
Feature detection — это способ определить, существует ли функция в определенных браузерах.
Feature inference — предположение: если одна функция присутствует (или нет), соответственно другая тоже будет присутствовать (или нет).
User Agent String — это текстовая строка, которую отправляет каждый браузер и к которой можно получить доступ через navigator.userAgent. Эта строка содержит в себе информацию о исполнительном окружении.
Подробнее тут:
14) Что такое поднятие (hoisting) в javascript?
Подробнее тут:
15) Что такое всплытие и погружение событий, в чем заключается разница между ними?
Подробнее тут:
16) Каковы плюсы и минусы расширения встроенных объектов JavaScript?
Подробнее тут:
17) Опишите разницу между == и === в JS ?
Подробнее тут:
18) Опишите политику кросс-доменных ограничений (same-origin policy) в контексте JS?
Пример:
Если скрипт нашего сайта делает простой запрос (GET) к чужому серверу и получает в ответ файл, при этом в ответе отсутствует заголовок Access-Control-Allow-Origin или в значении этого заголовка отсутствует наш домен, браузер запретит доступ к этому файлу (не даст посмотреть содержимое ответа) из скриптов нашего сайта.
Подробнее тут:
19) Что такое Тернарный оператор, о чем говорит слово “тернарный” ?
Подробнее тут:
20) Что такое strict режим в JS ? В чем его преимущества/недостатки ?
Подробнее тут:
21) Каковы основные преимущества / недостатки написания кода на языке компилируемого в JavaScript?
Среди его преимуществ стоит отметить:
- Поддержка популярными IDE: Sublime Text, Visual Studio Code, WebStorm, Eclipse.
- Реализует многие принципы объектно-ориентированного программирования: модификаторы доступа, наследование, инкапсуляцию и полиморфизм.
- Позволяет быстрее и проще писать сложные решения, которые легче тестировать и развивать благодаря поддержки ООП и строгой типизации.
- Есть система для работы с модулями, классами. Даже есть возможность создавать абстрактные классы.
- TypeScript обратно совместим с JavaScript. Любой код, написанный на JS будет выполнен. Также можно писать смешанный код и он будет валиден.
- Наличие дополнительных файлов (*.ts, *.d.ts, *.map), что неудобно для небольших проектов.
- Для некоторых браузеров необходима дополнительная настройка консоли для отладки TypeScript.
- TypeScript — язык с неявной статической типизацией: тип может быть описан как any, что отключит приведение к этому типу переменной. d.ts декларации не всегда соответствуют текущей версии библиотеки.
Подробнее тут:
22) В чем разница между mutable и immutable объектами? Приведите пример immutable объекта в JS.
23) Какие преимущества и недостатки неизменности (immutability) вы можете выделить?
- Простое и быстрое отслеживание изменений (например, не нужно отдельно сравнивать значения каждого поля вложенного объекта. Можно просто сравнить ссылки на объекты и отсеять вложенные ветки сравнений).
- Более безопасное использование и тестирование.
- Создание нового объекта при каждом изменении может стать русурсо-затратной операцией.
Подробнее тут:
24) Как вы можете достичь неизменности (immutability) в собственном коде?
25) Опишите разницу между синхронными и асинхронными функциями.
Асинхронные функции — выполняются отложено, попадая перед выполнением в очередь, что позволяет выполнить их не блокируя основной поток.
26) Что такое цикл событий (event loop) в JS ? Какая разница между «стеком вызовов» (call stack) и «очередью задач» (task queue)?
Сall stack — стек вызовов по которому можно определить в каком месте программы сейчас идет ее обработка. Если стек не пуст, значит идет выполнение синхронных задач, а именно, функции, которая находится на верхушке стека.
Event loop — механизм перемещающий готовые к синхронной обработке асинхронные задачи из task queue в call stack.
27) В чем заключаются различия между переменными, созданными с помощью let, var или const?
let — значение переменной объявленной этим оператором может быть установлено позже, а так же может быть переопределено в будущем. Переменная объявленная таким способом не будет видна за пределами блочной области видимости. Не доступен hoisting. Не поддерживает повторное объявление.
var — значение переменной объявленной этим оператором может быть установлено позже, а так же может быть переопределено в будущем. Переменная объявленная таким способом видна за пределами блочной области видимости. Доступен hoisting. Поддерживает повторное объявление.
Подробнее тут:
28) В чем заключаются различия между классом ES6 и конструктором функций ES5?
- Методы класса являются неперечислимыми свойствами;
- Код внутри класса по умолчанию обрабатывается в строгом режиме;
- Есть различия в синтаксисе;
Подробнее тут:
29) Можете ли вы назвать случай в котором наиболее уместно применение стрелочной функции? Чем этот тип функций отличается от других?
30) Что такое функция высшего порядка?
Array.prototype.reduce, Array.prototype.map и Array.prototype.filter — это функции высшего порядка.
Подробнее тут:
31) Приведите пример деструктурирующего присвоения (destructuring assignment) объекта или массива
var [firstItem] = arr;
По квадратным скобкам сразу видно, что arr — это массив
Подробнее тут:
32) Приведите пример генерации строки с помощью шаблонной строки ES6.
const variable = 'World!'
console.log(`Hello ${variable}`);
Подробнее тут:
33) Что такое каррирование в JS ?
34) Каковы преимущества использования spread syntax и чем он отличается от rest syntax?
let arr = ['one', 'two', 'three', 'four'];
// деструктуризация тремя точками (rest)
let [first, second, ...rest] = arr;
console.log(first); // 'one'
console.log(second); // 'two'
console.log(rest); // ['three', 'four']
// объединение тремя точками. Похожий синтаксис, но уже другое поведение
const restored = [first, second, ...rest];
console.log(restored) //['one', 'two', 'three', 'four'];