Вопрос проверяет понимание ограничений на типы ключей в структуре данных Map в JavaScript.
В JavaScript объект Map позволяет использовать в качестве ключей любые типы данных, включая примитивы (строки, числа, булевы значения, undefined, null, символы) и объекты (включая функции и массивы). Это одно из ключевых отличий от обычных объектов, где ключи могут быть только строками или символами.
Map использует алгоритм SameValueZero для сравнения ключей. Он похож на строгое равенство (===), но с одним отличием: NaN считается равным самому себе. Для примитивов сравнение происходит по значению, а для объектов — по ссылке.
const map = new Map();
// Примитивы как ключи
map.set('name', 'Alice');
map.set(42, 'answer');
map.set(true, 'boolean');
// Объекты как ключи
const objKey = { id: 1 };
map.set(objKey, 'object value');
// Функции как ключи
function myFunc() {}
map.set(myFunc, 'function value');
// Проверка
console.log(map.get('name')); // 'Alice'
console.log(map.get(42)); // 'answer'
console.log(map.get(objKey)); // 'object value'
console.log(map.get({ id: 1 })); // undefined (другой объект)Формально, в Map нет ограничений на типы ключей. Однако есть практические нюансы:
map.set({}, 'value') создаст ключ, который невозможно будет извлечь, так как у вас нет ссылки на этот объект.Map предоставляет гибкость в выборе ключей, что делает его идеальным для сценариев, где нужно ассоциировать данные с объектами или нестроковыми значениями. Однако важно помнить о ссылочной природе объектов и избегать потери ссылок на ключи, чтобы не создавать «утечки» данных.