Теоретические вопросы
Частые вопросы на собеседованиях Middle разработчика
Цель урока
Разбор теоретических вопросов, которые задают на собеседованиях.
JavaScript Core
Что такое hoisting?
Hoisting — поднятие объявлений переменных и функций в начало области видимости.
console.log(x); // undefined
var x = 5;
// Интерпретируется как:
var x;
console.log(x);
x = 5;Важно:
var— поднимается объявление, но не значениеlet,const— попадают в Temporal Dead Zone (TDZ)- Function Declaration — поднимается полностью
- Function Expression — как переменная
sayHello(); // "Привет!" — работает
function sayHello() {
console.log("Привет!");
}
// sayBye(); // Ошибка: sayBye is not a function
var sayBye = function() {
console.log("Пока!");
};Что такое Temporal Dead Zone?
TDZ — временная мёртвая зона для let и const от начала блока до объявления.
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 5;Чем == отличается от ===?
| Оператор | Название | Поведение |
|---|---|---|
== | Нестрогое | Приводит типы |
=== | Строгое | Сравнивает без приведения |
console.log(5 == "5"); // true (приведение)
console.log(5 === "5"); // false (разные типы)
console.log(null == undefined); // true
console.log(null === undefined); // falseРекомендация: всегда используй ===.
Что такое замыкание?
Замыкание — функция, которая запоминает переменные из внешней области видимости.
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3Применение:
- Приватные переменные
- Фабрики функций
- Мемоизация
Как работает this?
this определяется в момент вызова функции:
| Контекст | this |
|---|---|
| Метод объекта | Объект |
| Обычная функция | window / undefined |
| Стрелочная функция | Из внешнего контекста |
| new | Новый объект |
| call/apply/bind | Указанный объект |
const obj = {
name: "Объект",
regular() { console.log(this.name); },
arrow: () => { console.log(this.name); }
};
obj.regular(); // "Объект"
obj.arrow(); // undefined (this из внешнего контекста)Как работает Event Loop?
Event Loop — механизм выполнения асинхронного кода.
- Call Stack — синхронный код
- Microtask Queue — Promise, queueMicrotask
- Macrotask Queue — setTimeout, события
console.log("1");
setTimeout(() => console.log("2"), 0);
Promise.resolve().then(() => console.log("3"));
console.log("4");
// Вывод: 1, 4, 3, 2Что такое прототипное наследование?
Объекты наследуют свойства через цепочку прототипов.
const animal = { eats: true };
const rabbit = Object.create(animal);
rabbit.jumps = true;
console.log(rabbit.eats); // true (из прототипа)
console.log(rabbit.jumps); // true (собственное)Типы данных
Какие типы данных есть в JavaScript?
Примитивы (7):
stringnumberbooleannullundefinedsymbolbigint
Объекты:
- Object, Array, Function, Date, RegExp, Map, Set...
Чем null отличается от undefined?
| null | undefined | |
|---|---|---|
| Значение | Явное отсутствие | Не определено |
| typeof | "object" | "undefined" |
| Присваивается | Программистом | Автоматически |
let a; // undefined
let b = null; // null (явно)
typeof null; // "object" (баг языка)
typeof undefined; // "undefined"Что такое pass by reference vs pass by value?
Примитивы — передаются по значению (копия). Объекты — передаются по ссылке.
// По значению
let a = 5;
let b = a;
b = 10;
console.log(a); // 5 (не изменился)
// По ссылке
let obj1 = { x: 1 };
let obj2 = obj1;
obj2.x = 10;
console.log(obj1.x); // 10 (изменился!)Асинхронность
Что такое Promise?
Promise — объект для работы с асинхронными операциями.
Состояния:
pending— ожиданиеfulfilled— успехrejected— ошибка
const promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("Готово"), 1000);
});
promise
.then(result => console.log(result))
.catch(error => console.log(error));Чем async/await отличается от Promise?
async/await — синтаксический сахар над Promise.
// Promise
function getData() {
return fetch("/api")
.then(r => r.json())
.then(data => console.log(data));
}
// async/await
async function getData() {
const r = await fetch("/api");
const data = await r.json();
console.log(data);
}Практические вопросы
Как сделать глубокое копирование объекта?
// Способ 1: JSON (простой, но с ограничениями)
const copy1 = JSON.parse(JSON.stringify(obj));
// Способ 2: structuredClone (современный)
const copy2 = structuredClone(obj);
// Способ 3: рекурсивная функция
function deepClone(obj) {
if (obj === null || typeof obj !== "object") return obj;
if (Array.isArray(obj)) return obj.map(deepClone);
return Object.fromEntries(
Object.entries(obj).map(([k, v]) => [k, deepClone(v)])
);
}Как проверить, что объект пустой?
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
isEmpty({}); // true
isEmpty({ a: 1 }); // falseКак удалить дубликаты из массива?
const arr = [1, 2, 2, 3, 3, 3];
// Способ 1: Set
const unique1 = [...new Set(arr)];
// Способ 2: filter
const unique2 = arr.filter((item, index) => arr.indexOf(item) === index);Проверь себя
- Что выведет
typeof null? - Что такое TDZ?
- В каком порядке выполнятся: sync, setTimeout, Promise?
- Как работает
thisв стрелочной функции? - Чем
==отличается от===?