Вопрос проверяет понимание структуры Map, различий с обычным объектом и принципа сравнения ключей по ссылке.
Да, Map может использовать любое значение в качестве ключа: примитивы, объекты, массивы, функции. В отличие от обычного объекта, ключи в Map не приводятся к строке. Для объектов и функций сравнение ключей происходит по ссылке, а не по содержимому. Это делает Map удобным для хранения данных, привязанных к конкретным объектам.
Map — это коллекция пар ключ–значение, где ключом может быть любой тип данных без неявных преобразований.
Map — структура данных, которая хранит пары ключ–значение и сравнивает ключи по принципу SameValueZero (почти как ===, но с NaN).
Примитивы:
string
number
boolean
null
undefined
symbol
Ссылочные типы:
object
array
function
const map = new Map();
map.set("id", 1);
map.set(42, "answer");
console.log(map.get("id")); // 1
console.log(map.get(42)); // "answer"
const map = new Map();
const user = { name: "Ann" };
map.set(user, "data");
console.log(map.get(user)); // "data"
console.log(map.get({ name: "Ann" })); // undefined
Объекты сравниваются по ссылке, а не по структуре.
Даже одинаковые по содержимому объекты — разные ключи, если это разные ссылки.
В объекте ключи всегда приводятся к строке.
В Map ключ сохраняет исходный тип.
Map безопасен для ключей-объектов и не конфликтует с прототипом.
const obj = {};
const key = { a: 1 };
obj[key] = "value";
console.log(obj); // { "[object Object]": "value" }
Map может использовать любые типы данных как ключи и особенно полезен, когда ключами должны быть объекты или функции и важно сохранить их идентичность по ссылке.