--- 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])
iterablenull 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.lengthlength jest zawsze równa 0.Map. Pozwala rozszerzać prototyp wszystkich obiektów Map o własne własności.MapWszystkie 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')}}
Mapvar 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 MapNaN 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"
Map przy użyciu for..ofvar 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"
Arrayvar 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”.