У доповненні до використання Map- як об'єкт, там був фактичний Map
об'єкт в протягом деякого часу, яке є в друкованому при компіляції в ES6, або при використанні polyfill з ES6 типовими визначеннями :
let people = new Map<string, Person>();
Він підтримує той же функціонал Object
, що і більше, з дещо іншим синтаксисом:
// Adding an item (a key-value pair):
people.set("John", { firstName: "John", lastName: "Doe" });
// Checking for the presence of a key:
people.has("John"); // true
// Retrieving a value by a key:
people.get("John").lastName; // "Doe"
// Deleting an item by a key:
people.delete("John");
Це саме по собі має ряд переваг по порівнянні з використанням Map- як об'єкта, такі як:
- Підтримка ключів на основі рядків, наприклад, чисел чи об'єктів, жоден з яких не підтримується
Object
(ні, Object
не підтримує числа, він перетворює їх у рядки)
- Менше місця для помилок, коли не використовується
--noImplicitAny
, оскільки Map
завжди є тип ключа та тип значення , тоді як об'єкт може не мати підпису індексу
- Функціональність додавання / вилучення елементів (пари ключових значень) оптимізована для завдання, на відміну від створення властивостей на
Object
Крім того, Map
об’єкт надає більш потужний та елегантний API для загальних завдань, більшість з яких доступні не за допомогою простих Object
s без злому допоміжних функцій (хоча для деяких з них потрібен повний ітератор / ітерабельний поліфайл ES6 для цілей ES5 або нижче):
// Iterate over Map entries:
people.forEach((person, key) => ...);
// Clear the Map:
people.clear();
// Get Map size:
people.size;
// Extract keys into array (in insertion order):
let keys = Array.from(people.keys());
// Extract values into array (in insertion order):
let values = Array.from(people.values());