Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: EventEmitter, data structures, Map, Set, array

Какие структуры данных подходят для хранения подписчиков в реализации EventEmitter и в чём их отличие?

Вопрос проверяет понимание выбора структуры данных для хранения подписчиков в EventEmitter и их влияния на производительность и порядок вызова.

Короткий ответ

Для хранения подписчиков в EventEmitter обычно используют Map, где ключом является имя события, а значением — массив или Set функций-обработчиков. Map обеспечивает быстрый доступ к списку подписчиков по событию. Массив сохраняет порядок добавления, что важно для последовательного вызова, но удаление обработчика требует поиска. Set гарантирует уникальность и быстрое удаление, но не гарантирует порядок.

Длинный ответ

Выбор структуры данных для подписчиков EventEmitter

В реализации EventEmitter, такого как в Node.js, основная задача — эффективно хранить и управлять подписчиками (обработчиками) для различных событий. Ключевые требования: быстрый доступ к списку обработчиков по имени события, возможность добавлять и удалять обработчики, а также вызывать их в определенном порядке.

Основные структуры данных

  • Map (или объект): Используется для хранения соответствия между именем события и списком обработчиков. Map обеспечивает O(1) доступ к списку по ключу, что оптимально для частого вызова событий.
  • Массив (Array): Часто используется как список обработчиков для одного события. Массив сохраняет порядок добавления, что гарантирует последовательный вызов подписчиков в порядке их регистрации. Однако удаление конкретного обработчика требует поиска по массиву (O(n)).
  • Set: Альтернатива массиву, гарантирующая уникальность обработчиков (один и тот же обработчик не может быть добавлен дважды). Удаление из Set выполняется быстрее (O(1)), но Set не гарантирует порядок итерации (хотя в современных движках порядок вставки сохраняется).

Пример реализации

class EventEmitter {
  constructor() {
    this.events = new Map(); // Map для хранения событий
  }

  on(event, listener) {
    if (!this.events.has(event)) {
      this.events.set(event, []); // массив для порядка
    }
    this.events.get(event).push(listener);
  }

  emit(event, ...args) {
    const listeners = this.events.get(event);
    if (listeners) {
      listeners.forEach(listener => listener(...args));
    }
  }

  off(event, listener) {
    const listeners = this.events.get(event);
    if (listeners) {
      this.events.set(event, listeners.filter(l => l !== listener));
    }
  }
}

Отличия и применение

Массив предпочтителен, когда важен порядок вызова и частота добавления/удаления невысока. Set лучше, если требуется гарантировать уникальность и часто удалять обработчики. Map является стандартным выбором для хранения всех событий, так как обеспечивает быстрый доступ.

Вывод: Выбор структуры данных зависит от требований к порядку вызова, уникальности и производительности операций добавления/удаления. В большинстве реализаций EventEmitter используется комбинация Map и массива для баланса между скоростью и функциональностью.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#EventEmitter

#data structures

#Map

#Set

#array

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию