Объект Map содержит пары ключ-значение и сохраняет порядок вставки. Любое значение (как объекты, так и примитивы) могут быть использованы в качестве ключей.
Синтаксис
new Map([iterable])
Параметры
iterableМассивили любой другой итерируемый объект чьими элементами являются пары ключ-значение (массивы из двух элементов, например[[ 1, 'one' ],[ 2, 'two' ]]). Все пары ключ-значение будут добавлены в новый экземплярMap;nullрасценивается какundefined.
Описание
Объект Map итерируется в порядке вставки его элементов — цикл for...of будет возвращать массив [key, value] на каждой итерации.
Key equality
Сравнение ключей основано на алгоритме "SameValueZero": NaN равно NaN (несмотря на то, что NaN !== NaN), все другие значения рассматриваются равными исходя из семантики оператора строго равенства ===. В текущей спецификации ECMAScript -0 и +0 принимаются равными, но в ранних версиях обсуждения это было не так (см. "Value equality for -0 and 0" в таблице совместимости с браузерами).
Сравнение Объектов и Map
Объекты похожи на Map в том, что оба позволяют устанавливать значения по ключам, получать эти значения, удалять ключи и проверять их наличие. В связи с этим (и потому, что не было встроенных альтернатив), Объекты исторически использовались как Map. Однако, у них есть ряд отличий, который дает преимущества Map в ряде случаев:
- Ключами
ОбъектавыступаютСтрокииСимволы, в то время как любое значение может быть ключомMap, включаяфункции,объектыи примитивы. - В отличие от
Объектов, ключи вMapупорядочены. Таким образом, во время итерацииMap, ключи возвращаются в порядке вставки. - Вы легко можете получить количество элементов в
Mapс помощью свойстваsize, в то время как количество элементовОбъектаможет быть определено только вручную. Map- итерируемый объект и может быть итерирован напрямую, в то время какОбъекттребует ручного получения списка ключей и их итерации.Объектимеет прототип и поэтому имеет стандартный набор ключей, который, при неосторожности, может пересекаться с вашими ключами. С момента выхода ES5 это может быть изменено с помощьюmap = Object.create(null).Mapможет иметь более высокую производительность в случаях частого добавления или удаления ключей.
Свойства
Map.length- Значение свойства
lengthвсегда равно 0. - Чтобы узнать колчиество элементов в
Map- используйтеMap.prototype.size. get Map[@@species]- Функция-конструктор которая используется для создания производных объектов.
Map.prototype- Представляет прототип конструктора
Map. Позволяет добавлять свойства всем объектам типаMap.
Экземпляры Map
Все экземпляры Map наследуются от Map.prototype.
Свойства
Map.prototype.constructor- Returns the function that created an instance's prototype. This is the
Mapfunction by default. Map.prototype.size- Returns the number of key/value pairs in the
Mapobject.
Методы
Map.prototype.clear()- Removes all key/value pairs from the
Mapobject. Map.prototype.delete(key)- Returns
trueif an element in theMapobject existed and has been removed, orfalseif the element does not exist.Map.prototype.has(key)will returnfalseafterwards. Map.prototype.entries()- Returns a new
Iteratorobject that contains an array of[key, value]for each element in theMapobject in insertion order. Map.prototype.forEach(callbackFn[, thisArg])- Calls callbackFn once for each key-value pair present in the
Mapobject, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the this value for each callback. Map.prototype.get(key)- Returns the value associated to the
key, orundefinedif there is none. Map.prototype.has(key)- Returns a boolean asserting whether a value has been associated to the
keyin theMapobject or not. Map.prototype.keys()- Returns a new
Iteratorobject that contains the keys for each element in theMapobject in insertion order. Map.prototype.set(key, value)- Sets the value for the
keyin theMapobject. Returns theMapobject. Map.prototype.values()- Returns a new
Iteratorobject that contains the values for each element in theMapobject in insertion order. Map.prototype[@@iterator]()- Returns a new
Iteratorobject that contains an array of[key, value]for each element in theMapobject in insertion order.
Примеры
Использование объекта Map
var myMap = new Map();
var 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 !== {}
myMap.get(function() {}) // undefined, потому что keyFunc !== function () {}
Использование NaN в качестве ключей Map
NaN может быть использован в качестве ключа. Несмотря на то, что NaN не равен самому себе (NaN !== NaN вернёт true), следующий пример работает, потому что NaN обрабатывается особым образом:
var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN); // "not a number"
var otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"
Итерация Map при помощи for..of
Map может быть итерирован с помощью for..of:
var 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
var kvArray = [["key1", "value1"], ["key2", "value2"]];
// Используйте конструктор Map для преобразования двумерных массивов в Map
var 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
равно как и Массивы, Map могут быть клонированы:
var original = new Map([ [1, 'one'] ]); var clone = new Map(original); console.log(clone.get(1)); // one console.log(original === clone); // false.
Следует помнить, что данные не клонируются
Map могут быть слиты, с сохранением уникальности ключей:
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); var second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Слияние двух Map. Взят будет последний повторившийся ключ. // Оператор Spread по сути преобразует Map в массив var merged = new Map([...first, ...second]); console.log(merged.get(1)); // uno console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
Map могут быть слиты и с Массивами:
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); var second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Слияние Map и массива. Как и при слиянии двух Map - взят будет последний повторившийся ключ. var 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
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Map' в этой спецификации. |
Стандарт | Initial definition. |
| ECMAScript Latest Draft (ECMA-262) Определение 'Map' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Компьютеры | Мобильные | Server | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Map | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
new Map(iterable) | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
new Map(null) | Chrome Полная поддержка Да | Edge Полная поддержка 12 | Firefox Полная поддержка 37 | IE Полная поддержка 11 | Opera Полная поддержка Да | Safari Полная поддержка 9 | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 37 | Opera Android Полная поддержка Да | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
Map() without new throws | Chrome Полная поддержка Да | Edge Полная поддержка 12 | Firefox Полная поддержка 42 | IE Полная поддержка 11 | Opera Полная поддержка Да | Safari Полная поддержка 9 | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 42 | Opera Android Полная поддержка Да | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
| Key equality for -0 and 0 | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 29 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 29 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 4.0.0 |
clear | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 19 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 19 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
delete | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
entries | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 20 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 20 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
forEach | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 25 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 25 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
get | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
has | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
keys | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 20 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 20 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
prototype | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
set | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE
Частичная поддержка
11
| Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
size | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox
Полная поддержка
19
| IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android
Полная поддержка
19
| Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
values | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 20 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 20 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
@@iterator | Chrome Полная поддержка Да | Edge Полная поддержка Да | Firefox
Полная поддержка
36
| IE Нет поддержки Нет | Opera Полная поддержка Да | Safari Полная поддержка Да | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка Да | Firefox Android
Полная поддержка
36
| Opera Android Полная поддержка Да | Safari iOS Полная поддержка Да | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
@@species | Chrome Полная поддержка 51 | Edge Полная поддержка 13 | Firefox Полная поддержка 41 | IE Нет поддержки Нет | Opera Полная поддержка 38 | Safari Полная поддержка 10 | WebView Android Полная поддержка 51 | Chrome Android Полная поддержка 51 | Edge Mobile Полная поддержка 13 | Firefox Android Полная поддержка 41 | Opera Android Полная поддержка 38 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs
Полная поддержка
6.5.0
|
@@toStringTag | Chrome Полная поддержка 44 | Edge Нет поддержки Нет | Firefox Полная поддержка 51 | IE Нет поддержки Нет | Opera Нет поддержки Нет | Safari Нет поддержки Нет | WebView Android Полная поддержка 44 | Chrome Android Полная поддержка 44 | Edge Mobile Нет поддержки Нет | Firefox Android Полная поддержка 51 | Opera Android Нет поддержки Нет | Safari iOS Нет поддержки Нет | Samsung Internet Android Полная поддержка 4.0 | nodejs Нет поддержки Нет |
Легенда
- Полная поддержка
- Полная поддержка
- Частичная поддержка
- Частичная поддержка
- Нет поддержки
- Нет поддержки
- Смотрите замечания реализации.
- Смотрите замечания реализации.
- Пользователь должен сам включить эту возможность.
- Пользователь должен сам включить эту возможность.
- Использует нестандартное имя.
- Использует нестандартное имя.