Здесь собраны часто встречающиеся вопросы на собеседовании по Javascript.
Назови типы данных в Js
Чем отличается let var и const
Переменная, объявленная через var, видна везде в функции.
Переменная, объявленная через const или let, видна только в рамках блока {...}, в котором объявлена.
Объявление const задаёт константу, то есть переменную, которую нельзя менять:
const apple = 5;
apple = 10; // ошибкаЧем отличается == от ===
== и === это операторы который проверяют равны ли операнды и возвращает bolean true или false
== проверяет равны ли операнды даже если они разных типов
=== строгое равенство которое проверяет равны ли не только операнды но и их типы
Чем отличается setTimeout от setInterval
setTimeout позволяет вызвать функцию **один раз** через определённый интервал времени.
setInterval позволяет вызывать функцию **регулярно**, повторяя вызов через определённый интервал времени.
Что такое use strict
[use strict](https://learn.javascript.ru/strict-mode) - это установка, которая заставляет код обрабатываться в *строгом режиме*. Без этой установки код обрабатывается в *неограниченном режиме*. Это установку нужно писать в начале файла.
Строгий режим ограничивает функционал javascript в пользу багоустойчивого кода.
Например:
Нельзя присваивать значение в неопределённую переменную
(function() {
"use strict";
x = 5; // ReferenceError: x is not defined
})();
x = 5; // Создает глобальную переменную xНельзя дублировать свойства обьекта
(function() {
"use strict";
var x = {
a: 1,
a: 2
}; // SyntaxError: Duplicate data property in object literal
})(); // not allowed in strict mode
var x = {
a: 1,
a: 2
}; // x равно {a: 2}Что такое Callback
Коллбэк — это функция, которая должна быть выполнена после того, как другая функция завершила выполнение
Перечисли методы объекта
- Object.create()
- Object.keys()
- Object.values()
- Object.entries()
- Object.assign()
- Object.freeze()
- Object.seal()
- Object.getPrototypeOf()
Что такое глубокое и неглубокое копирования
При копировании объектов или массивов JavaScript копирует данные только на один уровень вглубь. Этот тип копирования называется поверхностным (shallow). Если необходимо полностью скопировать сложную структуру данных, например, массив с объектами, то нужно делать глубокое (deep) или полное копирование данных.
const itemsInCart = [
{ product: 'Носки', quantity: 3 },
{ product: 'Штаны', quantity: 1 },
{ product: 'Кепка', quantity: 1 },
]
const clonedCart = [...itemsInCart]
const deep = JSON.parse(JSON.stringify(itemsInCart))
console.log(itemsInCart[1] === deep[1])
// falseУ этого метода есть ограничение — копируемые данные должны быть сериализуемы.
Вот примеры несериализуемых данных: примитив undefined, функция, symbol - при вызове JSON.stringify получаем undefined
Что бы работать с сериализуемыми данными можно использовать библиотеку *Lodash* или *structuredClone* Источник - https://habr.com/ru/companies/otus/articles/719460/
Как удалить значение объекта
С помощью оператора delete
Что такое деструктуризация?
[Деструктуризация](https://learn.javascript.ru/destructuring) - это особый синтаксис, позволяющий извлекать значения из объектов
Деструктуризируй объект
const objToDestr = {
name: 'John',
age: 20,
address: {
country: 'Ukraine',
city: 'Kyiv'
},
}
let {name, address: {country}} = objToDestr
console.log(name, country)Что такое new Map
[Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) – это коллекция ключ/значение, как и `Object`. Но основное отличие в том, что `Map` позволяет использовать ключи любого типа.
Что такое weakMap
Расскажи что такое this
Для доступа к информации внутри объекта метод может использовать ключевое слово this
This — это ключевое слово, используемое в JavaScript, которое имеет особое значение, зависящее от контекста в котором оно применяется
let user = {
name: "John",
age: 30,
sayHi() {
// "this" - это "текущий объект".
alert(this.name);
}
};Как работают методы apply(), call() и bind()
Функции в JavaScript никак не привязаны к своему контексту this, с одной стороны, здорово – это позволяет быть максимально гибкими, одалживать методы и так далее.
Но с другой стороны – в некоторых случаях контекст может быть потерян. Способы явно указать this - методы bind, call и apply.
- Синтаксис метода call: func.call(context, arg1, arg2, ...)
При этом вызывается функция func, первый аргумент call становится её this, а остальные передаются «как есть». Вызов func.call(context, a, b...) – то же, что обычный вызов func(a, b...), но с явно указанным this(=context).
- Если нам неизвестно, с каким количеством аргументов понадобится вызвать функцию, можно использовать более мощный метод: apply. Вызов функции при помощи func.apply работает аналогично func.call, но принимает массив аргументов вместо списка.
func.call(context, arg1, arg2) идентичен вызову func.apply(context, [arg1, arg2]);
- Синтаксис встроенного bind: var wrapper = func.bind(context, [arg1, arg2...])
Методы bind и call/apply близки по синтаксису, но есть важнейшее отличие. Методы call/apply вызывают функцию с заданным контекстом и аргументами. А bind не вызывает функцию. Он только возвращает «обёртку», которую мы можем вызвать позже, и которая передаст вызов в исходную функцию, с привязанным контекстом.
Какие методы массивов ты знаешь
- Для добавления/удаления элементов:
-
push (...items)– добавляет элементы в конец, -pop()– извлекает элемент с конца, -shift()– извлекает элемент с начала, -unshift(...items)– добавляет элементы в начало. -splice(pos, deleteCount, ...items)– начиная с индексаposудаляетdeleteCountэлементов и вставляетitems. -slice(start, end)– создаёт новый массив, копируя в него элементы с индексаstartдоend(не включаяend). -concat(...items)– возвращает новый массив: копирует все члены текущего массива и добавляет к немуitems. Если какой-то изitemsявляется массивом, тогда берутся его элементы.- Для поиска среди элементов:
indexOf/lastIndexOf(item, pos)– ищетitem, начиная с позицииpos, и возвращает его индекс или1, если ничего не найдено.includes(value)– возвращаетtrue, если в массиве имеется элементvalue, в противном случаеfalse.find/filter(func)– фильтрует элементы через функцию и отдаёт первое/все значения, при прохождении которых через функцию возвращаетсяtrue.findIndexпохож наfind, но возвращает индекс вместо значения.
- Для перебора элементов:
forEach(func)– вызываетfuncдля каждого элемента. Ничего не возвращает.
- Для преобразования массива:
map(func)– создаёт новый массив из результатов вызоваfuncдля каждого элемента.sort(func)– сортирует массив «на месте», а потом возвращает его.reverse()– «на месте» меняет порядок следования элементов на противоположный и возвращает изменённый массив.split/join– преобразует строку в массив и обратно.reduce/reduceRight(func, initial)– вычисляет одно значение на основе всего массива, вызываяfuncдля каждого элемента и передавая промежуточный результат между вызовами.
- Дополнительно:
Array.isArray(arr)проверяет, является лиarrмассивом.
- Для поиска среди элементов:
Чем отличается map от forEach
- map сохраняет значение через return, forEach всегда возвращает undefined
- Второе различие между этими методами: map() можно привязывать к другим методам - reduce(), sort(), filter() и т.д. А вот forEach(), как вы можете догадаться, возвращается undefined.
- map более производительный
- map относится к функциональному программированию, а forEach к процедурному
Расскажи про reduce
Reduce используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.
let arr = [1, 2, 3, 4, 5]
var result = arr.reduce(function(sum, current) {
return sum + current;
}, 0);
alert( result ); // 15
//sum результат добавления двух чисел в начале
//берет значение 2 аргумента или 1 элемента массива
//current текущее значение массива которая в цикле меняеться 1,2,3...
// цикл будет выполняться следующим образом
// 0 + 1
// 1 + 2
// 3 + 3
//...
Что такое new Set
Set – это коллекция как и Array. Но основное отличие в том, что в Set каждое значение может появляться только один раз.
Что такое weakSet
weakSet - это тоже самое что и Set только более оптимизировано.
Расскажи про Promise
Promise — специальный объект JavaScript, который используется для написания и обработки асинхронного кода например запросов с сервера
Способ использования, в общих чертах, такой:
- Код, которому надо сделать что-то асинхронно, создаёт объект
promiseи возвращает его. - Внешний код, получив
promise, навешивает на него обработчики. - По завершении процесса асинхронный код переводит
promiseв состояниеfulfilled(с результатом) илиrejected(с ошибкой). При этом автоматически вызываются соответствующие обработчики во внешнем коде.
Синтаксис создания Promise:
let promise = new Promise(function(resolve, reject) {
// Эта функция будет вызвана автоматически
// В ней можно делать любые асинхронные операции,
// А когда они завершатся — нужно вызвать одно из:
// resolve(результат) при успешном выполнении
// reject(ошибка) при ошибке
})Чем отличаются стрелочные функции от обычной функции
- Сокращают написание функции
- Не имеют
this. - Не имеют
arguments. - Не могут быть вызваны с
new.
Что такое Event Loop и как он устроен
Многопоточность - это способность выполнять несколько параллельных задач - потоков
Что такое рекурсия? И какое главное правило рекурсии?
Рекурсия в javascript это когда функция вызывает саму себя. Главное правило рекурсии это написать выход из нее.
Что такое замыкание
Замыкание – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В некоторых языках это невозможно, или функция должна быть написана специальным образом, чтобы получилось замыкание. Но, как было описано выше, в JavaScript, все функции изначально являются замыканиями
Зачем нужны тесты
Тесты нужны для:
-
Уменьшение количество багов
-
Уменьшение времени работы над таской. Чем больше тестов, тем более багоустойчив код. Тем меньше таска переходит от разработчика ⇒ тестировщику ⇒ менеджеру
-
хорошие тесты - это еще и документация, и они помогают быстрее адаптироваться новым членам команды
Что такое TDD
TDD - это аббревиату́ра которая означает Test-driven development.
TDD - разработка на основе тестов.
Что такое BABEl
Babel - это транспайлер, который переписывает код современного стандарта Javascript (ES2015) на более поздний. Благодаря этому мы можем поддерживать браузеры которые не поддерживают новый функционал JS
Расскажи что такое ООП и методы этой парадигмы
Объектно-ориентированное программирование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения не значимые Соответственно, абстракция — это набор всех таких характеристик.
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.
Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом
Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Чем отличается Функционально программирование от ООП
В объектно-ориентированном программировании (ООП) вы создаете «объекты» (отсюда и название), которые представляют собой структуры, содержащие данные и методы. В функциональном программировании все является функцией. Функциональное программирование пытается разделить данные и поведение, а ООП объединяет эти концепции.
Что такое WebSocket
WebSocket – это современный способ иметь постоянное соединение между браузером и сервером.
Преимущества
- Нет ограничений, связанных с кросс-доменными запросами.
- Имеют хорошую поддержку браузерами.
- Могут отправлять/получать как строки, так и бинарные данные.
0.1 + 0.2 в javascript что будет
Внутри JavaScript число представлено в виде 64-битного формата IEEE-754. Для хранения числа используется 64 бита: 52 из них используется для хранения цифр, 11 для хранения положения десятичной точки и один бит отведён на хранение знака.
Если число слишком большое, оно переполнит 64-битное хранилище, JavaScript вернёт бесконечность:
alert( 1e500 ); // Infinity
Так что если 52 бит не хватает на цифры, то при записи происходит такой баг
Для точных вычислений использую библиотеку decimal.js
Операции с разными типами в например true + true = ?
null + undefined = Nan
null + {} = 'null[object Object]'
null + [] = 'null'
null + true = 1
null - true = -1
null + false = 0
null - false = 0
null + '' = 'null'
true + true = 2
true - true = 0
true + false = 1
true - false = 1
true + undefined = Nan
true + [] = 'true'
true + {} = 'true[object Object]'
true + '' = 'true'
false - false = 0
false + false = 0
false + undefined = NaN
false + [] = 'false'
false + {} = 'false[object Object]'
false + '' = 'false'obj[0] + obj[’0’]
let obj = {
”0”: 1,
0: 2
}
obj[’0’] // 2
obj[0] // 2
console.log(obj[0] + obj[’0’]) //Будет ровно 4