Мини-задачи и вопросы про производительность и память

Короткие практические задачи и теория про память — финальный аккорд собеседования.

Мини-задачи проверяют владение методами и структурами; вопросы про память — понимание того, как JavaScript управляет ресурсами.

Мини-задача: уникальные значения

Классика: убрать дубликаты из массива. Самый короткий способ — Set плюс spread.

const arr = [1, 2, 2, 3, 3, 3, 4];
const unique = [...new Set(arr)];
console.log(unique);

Вывод:

[ 1, 2, 3, 4 ]

Мини-задача: перевернуть строку

const reverse = (s) => s.split("").reverse().join("");
console.log(reverse("привет"));
console.log(reverse("abc"));

Вывод:

тевирп
cba

Мини-задача: группировка через reduce

Сгруппировать объекты по полю — частая задача на reduce.

const people = [
  { name: "Аня", dept: "eng" },
  { name: "Боря", dept: "sales" },
  { name: "Вика", dept: "eng" },
];

const byDept = people.reduce((acc, p) => {
  (acc[p.dept] = acc[p.dept] || []).push(p.name);
  return acc;
}, {});

console.log(byDept);

Вывод:

{ eng: [ 'Аня', 'Вика' ], sales: [ 'Боря' ] }

Про производительность: сложность операций

Что ценят в ответе: понимание стоимости операций. Поиск по объекту/Map/Set — это O(1), а по массиву через includes/indexOf — O(n). Для частых проверок «есть ли элемент» выбирают Set.

const ids = new Set([1, 2, 3]);
console.log(ids.has(2));   // быстрая проверка O(1)

const list = [1, 2, 3];
console.log(list.includes(2)); // линейный поиск O(n)

Вывод:

true
true

Про память: сборщик мусора

JavaScript управляет памятью автоматически: сборщик мусора удаляет объекты, на которые больше нет ссылок (алгоритм «достижимости» от корней). Программисту память вручную освобождать не нужно — но можно нечаянно удержать ссылку и получить утечку.

Типичные утечки памяти

  • Забытые таймеры/подписки: setInterval или обработчик события держат коллбэк (и его замыкание) живым.
  • Замыкания на большие объекты: функция «удерживает» весь захваченный контекст.
  • Глобальные переменные: ссылки из глобала живут вечно — объект не соберётся.
  • Растущие коллекции: кэш в обычном объекте, который никогда не очищается.

Хороший ответ: «Утечка в JS — это не нехватка освобождения, а удержание ненужной ссылки. Чтобы объект собрался, на него не должно остаться достижимых ссылок».

Итог

  • Set убирает дубликаты и даёт быстрый поиск O(1) против O(n) у массива.
  • Память освобождает сборщик мусора по достижимости — вручную чистить не нужно.
  • Утечки возникают из удержанных ссылок: таймеры, замыкания, глобальные переменные.
Проверьте себя
1. Как короче всего убрать дубликаты из массива?
Aarr.filter(unique)
B[...new Set(arr)]
Carr.sort()
Darr.map(x => x)
2. Какова сложность проверки наличия элемента в Set по сравнению с массивом?
AУ Set O(n), у массива O(1)
BУ Set O(1), у массива (includes) O(n)
CУ обоих O(1)
DУ обоих O(n)
3. Из-за чего чаще всего возникает утечка памяти в JavaScript?
AИз-за того, что не вызвали free()
BИз-за удержанной ненужной ссылки (таймеры, замыкания, глобальные переменные)
CПамять в JS не утекает никогда
DИз-за использования const
Поддержать проект