Словари в JavaScript: определение, синтаксис и практические приёмы

Что такое словарь
Словарь — структура данных, которая хранит связанные пары ключ–значение. Ключ используется для быстрого поиска соответствующего значения. В контексте JavaScript под словарём обычно понимают обычный объект (Object) или коллекцию Map.
Определение в одну строку: словарь — это контейнер значений, индексируемый по ключам вместо числовых индексов.
Важно: обычный Object имеет прототипную цепочку, поэтому некоторые свойства унаследованы; Map не наследует своих ключей и подходит для любых типов ключей.
Создание словаря
В JavaScript нет ключевого слова dictionary. Самые распространённые способы создания словаря:
Простой объект (литерал):
let emptyDictionary = {};Через конструктор Object:
let dictionary = new Object();Инициализация со значениями:
let petDictionary = {
"Pidgey": { Age: 0.5, Color: "Gray", Gender: "Male" },
"Mocha": { Age: 0.5, Color: "Brown", Gender: "Female" }
};Можно использовать нестроковые ключи в виде чисел или булевых значений (они будут приведены в строку у Object):
let wcDictionary = {
1: { Team: "Argentina" },
2: { Team: "France" }
};
let dictBool = {
true: { Message: "Confirmed" },
false: { Message: "Denied" }
};Альтернатива — коллекция Map, если нужны ключи произвольного типа и гарантированное поведение без прототипных свойств:
let map = new Map();
map.set({ id: 1 }, "objectKey");
map.set(1, "numberKey");Добавление значений в словарь
Чтобы добавить или обновить элемент в объекте:
dictionary[new_key] = new_value;
petDictionary["Apples"] = { Age: 2, Color: "Green", Gender: "Male" };
wcDictionary[3] = { Team: "Morocco" };Для Map используются методы set и get:
map.set("Mocha", { Age: 0.5, Color: "Brown" });Примечание: в Object ключи приводятся к строкам, в Map — сохраняют тип.
Получение значения по ключу
Чтение значения из объекта выглядит так:
let dictionaryValue = petDictionary["Mocha"];
console.log(dictionaryValue);В консоли будет объект со всеми полями значения.
Для Map используется метод get:
let val = map.get("Mocha");Обход всех элементов словаря
Чтобы получить список ключей у объекта, используйте Object.keys():
console.log(Object.keys(petDictionary));В консоли появится массив ключей:
Типичный цикл обхода значений по ключам:
for (const key of Object.keys(petDictionary)) {
console.log(key + ":");
console.log(petDictionary[key]);
}Для Map есть удобный итератор entries():
for (const [key, value] of map.entries()) {
console.log(key, value);
}Проверка наличия ключа
Для объектов можно использовать оператор in или hasOwnProperty:
let inDictionary = 'Mocha' in petDictionary; // true
let notInDictionary = 'a' in petDictionary; // false
let exists = petDictionary.hasOwnProperty('Mocha'); // true
let doesNotExist = petDictionary.hasOwnProperty('a'); // falseДля Map используйте has:
map.has('Mocha'); // true или falseВажно: оператор in проверяет всю цепочку прототипов, поэтому hasOwnProperty безопаснее для проверки собственных ключей объекта.
Удаление элемента из словаря
Присвоение null оставляет ключ в объекте, но очищает значение:
petDictionary['Apples'] = null;Чтобы удалить ключ полностью, используйте delete:
delete petDictionary['Apples'];Для Map используйте метод delete:
map.delete('Mocha');Когда словарь не подходит и альтернативы
Контрпример: если вам нужен упорядоченный список записей или частые операции добавления/удаления в середине, лучше использовать массивы или связанные списки.
Альтернативы и когда их выбрать:
- Map — если нужны ключи не только строковые, предсказуемое поведение без прототипных полей и быстрая итерация.
- WeakMap — для хранения данных, привязанных к объектам, без препятствий для GC (ключи — только объекты).
- Массивы — для упорядоченных наборов и индексированного доступа по числу.
Ментальные модели: представьте словарь как словарь в обычной жизни — вы ищете определение по слову (ключу), а не перебираете все слова.
Сниппет-читшит по операциям
// Создать
let obj = {};
let mp = new Map();
// Добавить
obj['k'] = 1;
mp.set('k', 1);
// Получить
let a = obj['k'];
let b = mp.get('k');
// Проверить
'k' in obj; obj.hasOwnProperty('k'); mp.has('k');
// Удалить
delete obj['k']; mp.delete('k');
// Обход
Object.keys(obj).forEach(k => console.log(k, obj[k]));
for (const [k, v] of mp) console.log(k, v);Роль‑ориентированные чек‑листы
Для разработчика:
- Выбрать Object или Map в зависимости от типов ключей.
- Избегать ключей, совпадающих со стандартными именами прототипа (например, “toString”).
- Использовать hasOwnProperty для проверки.
Для ревью кода:
- Проверить, что ключи нормализованы (например, одинаковый регистр).
- Проверить обработку отсутствующих значений и ошибок доступа.
Для инженера по производительности:
- Замерить узкие места при большом объёме данных.
- Рассмотреть Map или специализированные структуры при миллионах записей.
Мини‑методология выбора словаря
- Определите требования к ключам (строки или произвольные объекты). 2. Оцените объём и частоту операций. 3. Выберите Object, Map или специализированную структуру. 4. Напишите тесты на граничные случаи. 5. Прототипируйте и профилируйте.
Критерии приёмки
- Добавление, чтение, проверка и удаление работают в соответствии с тестами.
- Нет утечек памяти при использовании WeakMap там, где это необходимо.
- Код покрыт тестами для граничных ключей (undefined, null, “”, числа).
Часто задаваемые вопросы
Можно ли использовать объект как словарь для любых типов ключей?
Нет. У объектов ключи приводятся к строкам. Для произвольных типов (объекты, функции) используйте Map.
Когда стоит применять WeakMap?
Когда нужно хранить данные, привязанные к объектам, не мешая сборщику мусора удалять объекты‑ключи.
Как выбрать между Object и Map по производительности?
Map обычно быстрее для большого количества операций вставки/удаления и хранения сложных ключей; тестируйте на своей нагрузке.
Итог
Словари — мощный и универсальный инструмент для организации данных по ключам. В JavaScript вы можете использовать объекты для простых случаев и Map/WeakMap для более точного контроля над типами ключей и временем жизни данных. Выбор зависит от требований к типам ключей, объёму данных и ожидаемых операций.
Важно: тестируйте поведение на реальных данных и помните о различиях между Object и Map.
Дополнительные материалы: короткий чек‑лист, сниппеты и советы по выбору структуры даны выше.
Похожие материалы
Анализ тональности на Python с VADER и Tkinter
Проверить прокси в Windows
Темы рабочего стола в Ubuntu 18.04 LTS
Что делать, если Logitech G Pro Wireless не работает
Dev Drive в Windows 11 — как начать