JS Tower
JavaScript & TypeScriptПодготовка к собеседованию

Теоретические вопросы

Частые вопросы на собеседованиях 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 — механизм выполнения асинхронного кода.

  1. Call Stack — синхронный код
  2. Microtask Queue — Promise, queueMicrotask
  3. 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):

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol
  • bigint

Объекты:

  • Object, Array, Function, Date, RegExp, Map, Set...

Чем null отличается от undefined?

nullundefined
ЗначениеЯвное отсутствиеНе определено
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);

Проверь себя

  1. Что выведет typeof null?
  2. Что такое TDZ?
  3. В каком порядке выполнятся: sync, setTimeout, Promise?
  4. Как работает this в стрелочной функции?
  5. Чем == отличается от ===?