--- title: Map slug: Web/JavaScript/Reference/Global_Objects/Map tags: - ECMAScript 2015 - JavaScript - Map translation_of: Web/JavaScript/Reference/Global_Objects/Map ---
Объект Map содержит пары ключ-значение и сохраняет порядок вставки. Любое значение (как объекты, так и {{Glossary("Primitive", "примитивы")}}) могут быть использованы в качестве ключей.
new Map([iterable])
iterable[[ 1, 'one' ],[ 2, 'two' ]]). Все пары ключ-значение будут добавлены в новый экземпляр Map; null расценивается как undefined.Объект Map итерируется в порядке вставки его элементов — цикл {{jsxref("Statements/for...of", "for...of")}} будет возвращать массив [key, value] на каждой итерации.
Сравнение ключей основано на алгоритме "{{Glossary("SameValueZero", "SameValueZero")}}": NaN равно NaN (несмотря на то, что NaN !== NaN), все другие значения рассматриваются равными исходя из семантики оператора строгого равенства ===. В текущей спецификации ECMAScript -0 и +0 принимаются равными, но в ранних версиях обсуждения это было не так (см. "Value equality for -0 and 0" в таблице совместимости с браузерами).
Объекты похожи на Map в том, что оба позволяют устанавливать значения по ключам, получать эти значения, удалять ключи и проверять их наличие. В связи с этим (и потому, что не было встроенных альтернатив), {{jsxref("Object", "Объекты")}} исторически использовались как Map. Однако, у них есть ряд отличий, который дает преимущества Map в ряде случаев:
Map, включая {{jsxref("Function", "функции")}}, {{jsxref("Object", "объекты")}} и {{Glossary("Primitive", "примитивы")}}.Map упорядочены. Таким образом, во время итерации Map, ключи возвращаются в порядке вставки.Map с помощью свойства size, в то время как количество элементов {{jsxref("Object", "Объекта")}} может быть определено только вручную.Map - итерируемый объект и может быть итерирован напрямую, в то время как {{jsxref("Object", "Объект")}} требует ручного получения списка ключей и их итерации.map = Object.create(null).Map может иметь более высокую производительность в случаях частого добавления или удаления ключей.Map.lengthlength всегда равно 0.Map - используйте {{jsxref("Map.prototype.size")}}.Map. Позволяет добавлять свойства всем объектам типа Map.MapВсе экземпляры Map наследуются от {{jsxref("Map.prototype")}}.
Map.prototype.constructorMap по умолчанию.Map.prototype.sizeMap.Map.prototype.clear()Map.Map.prototype.delete(key)true, если элемент в объекте Map существовал и был удален, или false, если элемент не существует. Map.prototype.has(key) вернет false позже.Map.prototype.entries()Iterator который содержит массив [key, value] для каждого элемента в объекте Map в порядке вставки.Map.prototype.forEach(callbackFn[, thisArg])Map, в порядке вставки. Если для thisArg предоставляется параметр для forEach, он будет использоваться как значение this для каждого обратного вызова.Map.prototype.get(key)key, или undefined если его нет.Map.prototype.has(key)key в объекте Map или нет.Map.prototype.keys()Iterator содержащий ключи для каждого элемента в объекте Map в порядке вставки.Map.prototype.set(key, value)key в объекте Map. Возвращает объект Map.Map.prototype.values()Iterator который содержит значения для каждого элемента в объекте Map в порядке вставки.Map.prototype[@@iterator]()Iterator который содержит массив [key, value] для каждого элемента в объекте Map в порядке вставки.Mapconst myMap = new Map();
const keyObj = {},
keyFunc = function () {},
keyString = 'a string';
// задание значений
myMap.set(keyString, 'value associated with “a string”');
myMap.set(keyObj, 'value associated with keyObj');
myMap.set(keyFunc, 'value associated with keyFunc');
myMap.size; // 3
// получение значений
myMap.get(keyString); // value associated with “a string”
myMap.get(keyObj); // value associated with keyObj
myMap.get(keyFunc); // value associated with keyFunc
myMap.get('a string'); // "value associated with 'a string'"
// потому что keyString === 'a string'
myMap.get({}); // undefined, потому что keyObj !== {} ({} — это литеральная нотация конструктора класса Object)
myMap.get(function() {}) // undefined, потому что keyFunc !== function () {}
NaN в качестве ключей MapNaN может быть использован в качестве ключа. Несмотря на то, что NaN не равен самому себе (NaN !== NaN вернёт true), следующий пример работает, потому что NaN обрабатывается особым образом:
const myMap = new Map();
myMap.set(NaN, 'not a number');
myMap.get(NaN); // not a number
const otherNaN = Number('foo');
myMap.get(otherNaN); // not a number
Map при помощи for..ofMap может быть итерирован с помощью for..of:
const myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
for (var key of myMap.keys()) {
console.log(key);
}
// 0
// 1
for (var value of myMap.values()) {
console.log(value);
}
// zero
// one
for (var [key, value] of myMap.entries()) {
console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
Map при помощи forEach()Map может быть итерирован с помощью метода forEach():
myMap.forEach(function(value, key) {
console.log(`${key} => ${value}`);
});
// 0 => zero
// 1 => one
Arrayconst kvArray = [['key1', 'value1'], ['key2', 'value2']];
// Используйте конструктор Map для преобразования двумерных массивов в Map
const myMap = new Map(kvArray);
myMap.get('key1'); // вернёт “value1”
// Используйте функцию Array.from для трансформации Map в двумерный key-value массив
console.log(Array.from(myMap)); // Выведет точно такой же массив как kvArray
// Или используйте итераторы keys или values чтобы преобразовать ключи или значения в массивы
console.log(Array.from(myMap.keys())); // Выведет ['key1', 'key2']
Map Равно как и {{jsxref("Array", "Массивы")}}, Map могут быть клонированы:
const original = new Map([ [1, 'one'] ]); const clone = new Map(original); console.log(clone.get(1)); // one console.log(original === clone); // false.
Следует помнить, что данные не клонируются.
Map могут быть слиты, с сохранением уникальности ключей:
const first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); const second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Слияние двух Map. Взят будет последний повторившийся ключ. // Оператор Spread по сути преобразует Map в массив const merged = new Map([...first, ...second]); console.log(merged.get(1)); // uno console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
Map могут быть слиты и с {{jsxref("Array", "Массивами")}}:
const first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); const second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Слияние Map и массива. Как и при слиянии двух Map - взят будет последний повторившийся ключ. const merged = new Map([...first, ...second, [1, 'eins']]); console.log(merged.get(1)); // eins console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
| Спецификация | Статус | Комментарий |
|---|---|---|
| {{SpecName('ES2015', '#sec-map-objects', 'Map')}} | {{Spec2('ES2015')}} | Initial definition. |
| {{SpecName('ESDraft', '#sec-map-objects', 'Map')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Map")}}