--- 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.length
length
всегда равно 0.Map
- используйте {{jsxref("Map.prototype.size")}}.Map
. Позволяет добавлять свойства всем объектам типа Map
.Map
Все экземпляры Map
наследуются от {{jsxref("Map.prototype")}}.
Map.prototype.constructor
Map
по умолчанию.Map.prototype.size
Map
.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
в порядке вставки.Map
const 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
в качестве ключей Map
NaN
может быть использован в качестве ключа. Несмотря на то, что 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..of
Map
может быть итерирован с помощью 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
Array
const 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")}}