--- title: Map slug: Web/JavaScript/Reference/Global_Objects/Map tags: - ECMAScript 2015 - JavaScript - Map translation_of: Web/JavaScript/Reference/Global_Objects/Map original_slug: Web/JavaScript/Referencje/Obiekty/Map ---
{{JSRef}}

Map jest prostym obiektem mapującym klucze na wartości. Każdy element (zarówno obiekt jak i {{Glossary("Primitive", "wartości proste")}}) mogą być użyte zarówno jako klucz jak i wartość.

Składnia

new Map([iterable])

Parametry

iterable
Iterable jest tablicą lub innym iterowalnym obiektem, którego elementy są parami typu klucz-wartość (np. 2 elementowa tablica). Każda para klucz-wartość jest dodawana do obiektu new Map. null jest traktowane jako undefined.

Opis

Obiekt Map iteruje swoje elementy we wprowadzonej kolejności — pętla {{jsxref("Statements/for...of", "for...of")}} zwraca tablicę  [key, value] dla każdej iteracji.

Należy pamiętać, że kolejność iteracji dla Map mapującej obiekty, w szczególności np. dla słownika słowników, odzwieciedlać będzie jedynie kolejność dodawania obiektów do kolekcji, natomiast kolejność dodawania elementów do samych obiektów nie jest gwarantowana i powinna być traktowana jako losowa.

Równość kluczy

Klucze porównywane są według algorytmu "same-value" (tej samej wartości).

NaN jest traktowana jako równa NaN (mimo tego, że NaN !== NaN). Wszystkie inne wartości są uważane za równe zgodnie z semantyką ===  operatora równości.

W obecnej specyfikacji ECMAScript -0 === +0, choć wcześniejsze propozycje zakładały inne zachowanie, co zaowocowało implementacją w niektórych wersjach przeglądarek. Szczegóły zawarte są w  "Value equality for -0 and 0"  w tabeli kompatybilności przeglądarek.

Porównanie Obiektów i Map

{{jsxref("Object", "Obiekty")}} są podobne do Map. W obu przypadkach pozwalają ustawić klucze dla wartości, zwracają te wartości, usuwają klucze i wykrywają czy coś jest przechowywane jako klucz. Z tego powodu (i ponieważ nie było innych wbudowanych alternatyw), Object  był używany wcześniej jako Map. Istnieją jednak ważne różnice pomiędzy Obiektami i Mapami, które powodują, że Map jest lepszym wyborem w pewnych przypadkach:

Nie oznacza to, że powinno się używać Maps wszędzie. Obiekty są wciąż używane w większości przypadków.  Instancje Map są użyteczne dla kolekcji, warto rozważyć ich zaadaptowanie jedynie w przypadkach, gdy wcześniej używano dla nich obiektów. Obiekty powinny być używane jako rejestr z polami i metodami. Jeśli wciąż nie jesteś pewien czego użyć, pomocne mogą okazać się poniższe pytania:

Jeśli odpowiedziałeś 'tak' na którekolwiek z tych pytań, prawdopodobnie powinieneś użyć Map. I przeciwnie, jeśli masz zamknięty zbiór kluczy, jeśli musisz odwoływać się do poszczególnych, specyficznych kluczy a każdy z nich ma swoje, odrębne od innych znaczenie, najprawdopodobniej potrzebujesz obiektu.

Własności

Map.length
Wartość length  jest zawsze równa 0.
{{jsxref("Map.@@species", "get Map[@@species]")}}
Funkcja konstruktora używana do tworzenia obiektów pochodnych.
{{jsxref("Map.prototype")}}
Reprezentuje prototyp funkcji konstruktora Map. Pozwala rozszerzać prototyp wszystkich obiektów Map o własne własności.

Instancje Map

Wszystkie instancje Map  dziedziczą po {{jsxref("Map.prototype")}}.

Własności

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Properties')}}

Metody

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Methods')}}

Przykłady

Używanie obiektu typu Map

var myMap = new Map();

var keyString = 'a string',
    keyObj = {},
    keyFunc = function() {};

// setting the values
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

// getting the values
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'"
                         // because keyString === 'a string'
myMap.get({});           // undefined, because keyObj !== {}
myMap.get(function() {}) // undefined, because keyFunc !== function () {}

Użycie NaN jako kluczy w  Map

NaN can also be used as a key. Even though every NaN is not equal to itself (NaN !== NaN is true), the following example works, because NaNs are indistinguishable from each other:

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"

Iteracja po Map przy użyciu 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

Iteracja po Map przy użyciu forEach()

myMap.forEach(function(value, key) {
  console.log(key + ' = ' + value);
});
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

Relacja do obiektów typu Array

var kvArray = [['key1', 'value1'], ['key2', 'value2']];

// Use the regular Map constructor to transform a 2D key-value Array into a map
var myMap = new Map(kvArray);

myMap.get('key1'); // returns "value1"

// Use the spread operator to transform a map into a 2D key-value Array.
console.log(uneval([...myMap])); // Will show you exactly the same Array as kvArray

// Or use the spread operator on the keys or values iterator to get
// an array of only the keys or values
console.log(uneval([...myMap.keys()])); // Will show ["key1", "key2"]

Specyfikacje

Specyfikacja Status Komentarz
{{SpecName('ES2015', '#sec-map-objects', 'Map')}} {{Spec2('ES2015')}} Początkowa definicja
{{SpecName('ESDraft', '#sec-map-objects', 'Map')}} {{Spec2('ESDraft')}}

Kompatybilność przeglądarek

{{CompatibilityTable}}

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support

{{ CompatChrome(38) }} [1]

12 {{ CompatGeckoDesktop("13") }} 11 25 7.1
Constructor argument: new Map(iterable) {{ CompatChrome(38) }} 12 {{ CompatGeckoDesktop("13") }} {{CompatNo}} 25 {{CompatSafari("9")}}
iterable {{ CompatChrome(38) }} 12 {{ CompatGeckoDesktop("17") }} {{CompatNo}} 25 7.1
Map.clear() {{ CompatChrome(31) }}
{{ CompatChrome(38) }}
12 {{CompatGeckoDesktop("19")}} 11 25 7.1
Map.keys(), Map.values(), Map.entries() {{ CompatChrome(37) }}
{{ CompatChrome(38) }}
12 {{CompatGeckoDesktop("20")}} {{CompatNo}} 25 7.1
Map.forEach() {{ CompatChrome(36) }}
{{ CompatChrome(38) }}
12 {{CompatGeckoDesktop("25")}} 11 25 7.1
Key equality for -0 and 0 {{ CompatChrome(34) }}
{{ CompatChrome(38) }}
12 {{CompatGeckoDesktop("29")}} {{CompatNo}} 25 {{CompatSafari("9")}}
Constructor argument: new Map(null) {{CompatVersionUnknown}} 12 {{CompatGeckoDesktop("37")}} 11 {{CompatVersionUnknown}} {{CompatSafari("9")}}
Monkey-patched set() in Constructor {{CompatVersionUnknown}} 12 {{CompatGeckoDesktop("37")}} {{CompatNo}} {{CompatVersionUnknown}} {{CompatSafari("9")}}
Map[@@species] {{CompatChrome("51")}} 13 {{CompatGeckoDesktop("41")}} {{CompatNo}} {{CompatOpera("38")}} {{CompatSafari("10")}}
Map() without new throws {{CompatVersionUnknown}} 12 {{ CompatGeckoDesktop("42") }} 11 {{CompatVersionUnknown}} {{CompatSafari("9")}}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatNo}} {{ CompatChrome(38) }} [1] {{ CompatGeckoMobile("13") }} {{CompatNo}} {{CompatNo}} 8
Constructor argument: new Map(iterable) {{CompatNo}} {{ CompatChrome(38) }} {{ CompatGeckoMobile("13") }} {{CompatNo}} {{CompatNo}} 9
iterable {{CompatNo}} {{CompatNo}} {{ CompatGeckoMobile("17") }} {{CompatNo}} {{CompatNo}} 8
Map.clear() {{CompatNo}} {{ CompatChrome(31) }}
{{ CompatChrome(38) }}
{{CompatGeckoMobile("19")}} {{CompatNo}} {{CompatNo}} 8
Map.keys(), Map.values(), Map.entries() {{CompatNo}} {{ CompatChrome(37) }}
{{ CompatChrome(38) }}
{{CompatGeckoMobile("20")}} {{CompatNo}} {{CompatNo}} 8
Map.forEach() {{CompatNo}} {{ CompatChrome(36) }}
{{ CompatChrome(38) }}
{{CompatGeckoMobile("25")}} {{CompatNo}} {{CompatNo}} 8
Key equality for -0 and 0 {{CompatNo}} {{ CompatChrome(34) }}
{{ CompatChrome(38) }}
{{CompatGeckoMobile("29")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
Constructor argument: new Map(null) {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("37")}} {{CompatUnknown}} {{CompatUnknown}} 9
Monkey-patched set() in Constructor {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("37")}} {{CompatUnknown}} {{CompatUnknown}} 9
Map[@@species] {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile("41")}} {{CompatUnknown}} {{CompatUnknown}} 10
Map() without new throws 5.1 {{CompatUnknown}} {{CompatGeckoMobile("42")}} {{CompatUnknown}} {{CompatUnknown}} 9

[1] Starting with Chrome 31, the feature was available behind a preference. In chrome://flags, activate the entry “Enable Experimental JavaScript”.

Zobacz też