Гид по технологиям

Словарь в JavaScript — Object и Map

5 min read JavaScript Обновлено 03 Jan 2026
Словарь в JavaScript — Object и Map
Словарь в JavaScript — Object и Map

Ноутбук на столе с чашкой кофе

Что такое словарь

Кратко: словарь хранит значения по уникальным ключам. Ключ — идентификатор; значение — любые данные. В JavaScript объект часто используется как словарь, но у объектов есть особенности: ключи по умолчанию приводятся к строкам, а свойства наследуются через прототип. Map хранит ключи без приведения и сохраняет порядок вставки, WeakMap позволяет использовать объектные ключи и освобождать память автоматически.

Краткое определение терминов:

  • Словарь — структура пар ключ:значение.
  • Ключ — уникальный идентификатор для значения.
  • Значение — данные, связанные с ключом.

Как создать объект-словарь

Объект в JavaScript — быстрый и привычный способ хранить пары ключ:значение. Создать пустой объект можно несколькими способами:

let dictionary = new Object();

Или коротко:

let emptyDictionary = {};

Инициализировать объект при создании можно перечислением пар “ключ: значение”:

let petDictionary = {  
    "Pidgey": { Age: 0.5, Color: "Gray", Gender: "Male" },  
    "Mocha": { Age: 0.5, Color: "Brown", Gender: "Female" },  
};

Важно: хотя в примерах ключи выглядят как строки, JavaScript при использовании объектов приводит числовые и булевы ключи к строкам. Если вам нужны ключи любого типа (например, объекты), рассмотрите Map.

Примеры с числами и булевыми значениями (они будут приведены к строкам):

let wcDictionary = {   
   1: { Team: "Argentina" },   
   2: { Team: "France" },   
};  
  
let dictBool = {   
   true: { Message: "Confirmed" },   
   false: { Message: "Denied" },   
};

Как добавлять значения в объект-словарь

Чтобы добавить или обновить свойство объекта, используйте синтаксис с квадратными скобками или точечную нотацию (если ключ — допустимый идентификатор):

dictionary[new_key] = new_value

Пример:

petDictionary["Apples"] = { Age: 2, Color: "Green", Gender: "Male" };

Если ключ — число, JavaScript приведёт его к строке:

wcDictionary[3] = { Team: "Morocco" };

Как получить значение по ключу

Доступ к значению выполняется по ключу:

let dictionaryValue = petDictionary["Mocha"];  
console.log(dictionaryValue);

Вывод в консоль значения элемента словаря

Возвращается именно то значение (объект или примитив), которое было записано под этим ключом.

Как итерировать по элементам словаря

Чтобы получить список ключей объекта, используйте Object.keys(). Этот метод возвращает массив ключей (в порядке вставки для обычных строковых ключей):

console.log(Object.keys(petDictionary));

Вывод в консоль списка ключей словаря

Перебор значений с помощью ключей:

for (const key of Object.keys(petDictionary)) {   
   console.log(key + ": ");   
   console.log(petDictionary[key]);  
};

Результат:

Вывод в консоль всех элементов словаря

Дополнительно:

  • Object.entries(obj) вернёт массив пар [ключ, значение].
  • for…in перебирает перечислимые свойства, включая унаследованные — поэтому проверяйте hasOwnProperty при необходимости.

Как проверить наличие ключа

Два простых способа — оператор in и метод hasOwnProperty:

let inDictionary = 'Mocha' in petDictionary;  // true или false  
let notInDictionary = 'a' in petDictionary;  // false
let exists = petDictionary.hasOwnProperty('Mocha');  // true  
let doesNotExist = petDictionary.hasOwnProperty('a');  // false

Отличие: оператор in проверяет цепочку прототипов, а hasOwnProperty — только собственные свойства объекта.

Как удалить значение из словаря

Можно присвоить null или undefined, чтобы пометить отсутствие значения:

petDictionary['Apples'] = null;

Однако соответствующее свойство останется в объекте. Чтобы удалить его полностью, используйте delete:

delete petDictionary['Apples'];

Замечание: иногда удобнее хранить явно пустые значения (null/undefined), если важна сохранённая структура данных. Если нужно полностью убрать ключ — delete.

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

Альтернативы: Map и WeakMap

Object хорош для простых случаев и сериализации в JSON. Но у объектов есть ограничения, которые решают Map и WeakMap.

Когда использовать Map:

  • Нужно использовать в качестве ключа какой‑то объект (не строка).
  • Важно сохранить порядок вставки.
  • Нужны методы size, clear, keys(), values(), entries().

Примеры с Map:

let map = new Map();
map.set("Pidgey", { Age: 0.5, Color: "Gray", Gender: "Male" });
console.log(map.get("Pidgey"));

// Объект в качестве ключа
let objKey = { id: 1 };
map.set(objKey, "value");
console.log(map.get(objKey)); // "value"

WeakMap полезен, когда ключи — объекты, и вы хотите, чтобы сборщик мусора мог освобождать память, когда больше нет других ссылок на ключ. У WeakMap нет методов для перечисления ключей или размера, потому что ключи могут исчезать автоматически.

let wm = new WeakMap();
let keyObj = {};
wm.set(keyObj, "metadata");
// Когда keyObj больше не нужен, он может быть удалён сборщиком мусора вместе со значением

Сравнение: Object vs Map vs WeakMap

КритерийObjectMapWeakMap
Ключи произвольного типанет (ключи приводятся к строкам)дада (только объекты)
Порядок вставкичастично (строковые ключи)данет
Методы для работыстандартные свойстваset/get/has/size/clearset/get/has (без перечисления)
Сериализация в JSONданет (нужна конвертация)нет

Практические правила и эвристики

  • Если нужно сериализовать данные в JSON — используйте Object или массивы.
  • Если вы хотите ключи-объекты или порядок вставки — используйте Map.
  • Для временных привязок к объектам без утечек памяти — WeakMap.
  • Для простых конфигураций и настроек достаточно Object.

Чеклист для разработчика

  • Определите, будут ли ключи только строками.
  • Нужно ли перечисление ключей и порядок вставки?
  • Требуется ли сериализация в JSON?
  • Есть ли риск утечек памяти из-за ссылок на объекты?
  • Нужны ли дополнительные методы (size, clear)?

Snippets — быстрый набор операций

  • Получить все пары:
for (const [k, v] of Object.entries(petDictionary)) {
  console.log(k, v);
}
  • Проверить и удалить безопасно:
if (petDictionary.hasOwnProperty('Mocha')) {
  delete petDictionary['Mocha'];
}

Мини‑методология: выбрать структуру данных

  1. Опишите требования к ключам и сериализации.
  2. Выберите Object, Map или WeakMap по критериям.
  3. Напишите тесты на граничные случаи (ключи с одинаковыми строковыми представлениями).
  4. Покройте код unit‑тестами и проверьте поведение в браузерах/Node.

Пример тестовых случаев (кратко)

  • Добавление, чтение, обновление, удаление свойства.
  • Проверка наличия унаследованных свойств (симуляция конфликтов с прототипом).
  • Сериализация объекта и проверка совместимости ключей.

Решающее дерево (упрощённое)

flowchart TD
  A[Ключи — только строки?] -->|Да| B[Требуется сериализация?]
  A -->|Нет 'нужны объекты'| C[Используйте Map или WeakMap]
  B -->|Да| D[Используйте Object/JSON]
  B -->|Нет| C

Глоссарий (1‑строчные определения)

  • Словарь: коллекция пар ключ:значение.
  • Ключ: идентификатор для доступа к значению.
  • Map: встроенная коллекция ES6 для пар ключ:значение с ключами произвольного типа.
  • WeakMap: Map с «слабыми» ссылками на объектные ключи, не поддерживает перечисление.
  • Прототип: объект, откуда наследуются свойства в JavaScript.

Примеры, когда подход «Object как словарь” может провалиться

  • Нужны объектные ключи: Object приведёт их к строкам, потеряется уникальность.
  • Конфликты с унаследованными именами свойств (например, hasOwnProperty).
  • Необходима точная контроль над удалением ссылок для сборщика мусора — тут нужен WeakMap.

Примечания по безопасности и приватности

  • Не храните секретные данные в объектах, которые затем сериализуются в лог или отправляются в клиенты.
  • WeakMap удобен для привязки приватных метаданных к объектам без риска случайной сериализации.

Краткое резюме Словарь в JavaScript удобно реализовать через Object для простых задач и сериализации. Map и WeakMap решают ограничения Object: ключи произвольного типа, порядок, и управление памятью. Выбирайте структуру по семантике данных и требованиям к сериализации, а не только по привычке.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство