--- 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 ---
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ść.
new Map([iterable])
iterable
null
jest traktowane jako undefined.
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.
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.
{{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:
Map
mogą być dowolną wartością, włączając w to funkcje, obiekty czy wartości proste.size
, podczas gdy wielkość obiektu musi być określana ręcznie.Object.create(null)
(dostępne od ES5), ale było to rzadko stosowane rozwiązanie.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.
Map.length
length
jest zawsze równa 0.Map
. Pozwala rozszerzać prototyp wszystkich obiektów Map
o własne własności.Map
Wszystkie instancje Map
dziedziczą po {{jsxref("Map.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Methods')}}
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 () {}
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 NaN
s 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"
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
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"
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"]
Specyfikacja | Status | Komentarz |
---|---|---|
{{SpecName('ES2015', '#sec-map-objects', 'Map')}} | {{Spec2('ES2015')}} | Początkowa definicja |
{{SpecName('ESDraft', '#sec-map-objects', 'Map')}} | {{Spec2('ESDraft')}} |
{{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”.