Map
Resum
L'objecte Map
és un simple mapa de parelles clau/valor. Qualsevol valor (tant objectes com primitive values) poden fer-se servir tant com a clau com a valor.
Sintaxi
new Map([iterable])
Paràmetres
iterable
- Iterable és un Array o un altre objecte iterable els quals els seus elements són parelles clau/valor (Arrays de 2 elements). Cada parella clau/valor serà afegida al nou mapa. nul és tracta com a indefinit.
Descripció
Un objecte Map pot iterar els seus elements en ordre d'inserció - un bucle for..of
retornarà un array de [key, value]
per cada iteració.
Igualtat de claus
La igualtat de claus es basa en l'algorisme "mateix valor": NaN
es considera igual a NaN
(tot i que NaN !== NaN
) i tots els altres valors es consideren iguals d'acord amb la semàntica de l'operador ===
. En versions anteriors a l'esborrany de l'ECMAScript 6 -0
i +0
es consideraven diferents (tot i que -0 === +0
), aquest comportament s'ha canviat en versions posteriors i ha sigut adaptat al (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (errada 952870) i una versió diària de Chrome.
Comparació d'objectes amb mapes
Els Objects
son similars als Maps
en el sentit que tots dos permeten assignar valors a claus, obtenir aquests valors, esborrar claus i detectar si una clau té un valor assignat o no. Degut a això, històricament s'han fet anar Objects
com a Maps
; tot i això existeixen diferències importants entre Objects
i Maps
que fan que l'ús de Map
sigui millor.
- Un
Object
té un prototipus, això implica que hi haurà algunes claus definides inicialment. Aquest problem es pot adreçar utilitzantmap = Object.create(null)
. - Les claus d'un
Object
sónStrings
, mentre que les claus d'unMap
poden ser de qualsevol tipus. - És fàcil obtindre el tamany d'un
Map
mentre que el tamany d'unObject
ha de ser calculat manualment.
Utilitzeu mapes en comptes d'objejctes quan les claus no se sàpiguin en temps d'execució, o bé quan totes les claus o els valors siguin del mateix tipus.
Utilitzeu objectes quan hi hagi una lògica que operi els elements individualment.
Propietats
Map.length
- El valor de la propietat
length
és 1. Map.prototype
(en-US)- Representa el prototipus pel constructor
Map
. Permet afegir propietats a tots els objectes de tipusMap
.
Instàncies de Map
Totes les instàncies de Map
hereten de Map.prototype
(en-US).
Propietats
{{page('ca/Web/JavaScript/Reference/Global_Objects/Map/prototype','Propietats')}}
Mètodes
{{page('ca/Web/JavaScript/Reference/Global_Objects/Map/prototype','Mètodes')}}
Exemples
Exemple: Utilitzar l'objecte Map
var myMap = new Map();
var keyObj = {},
keyFunc = function () {},
keyString = "a string";
// preparar els valors
myMap.set(keyString, "valor associat a amb 'un string'");
myMap.set(keyObj, "valor associat amb keyObj");
myMap.set(keyFunc, "valor associat amb with keyFunc");
myMap.size; // 3
// obtenir els valors
myMap.get(keyString); // "valor associat amb 'un string'"
myMap.get(keyObj); // "valor associat amb keyObj"
myMap.get(keyFunc); // "valor associat amb keyFunc"
myMap.get("a string"); // "valor associat amb 'un string'"
// com que keyString === 'un string'
myMap.get({}); // undefined, perquè keyObj !== {}
myMap.get(function() {}) // undefined, perquè keyFunc !== function () {}
Exemple: Utilitzar NaN
com a claus en un Map
NaN
també pot emprar-se com a clau. Tot i que NaN
no és igual a si mateix (NaN !== NaN
és cert), l'exemple següent funciona perquè els NaN
s són indistinguibles entre ells:
var myMap = new Map();
myMap.set(NaN, "no un nombre");
myMap.get(NaN); // "no un nombre"
var altreNaN = Number("foo");
myMap.get(altreNaN); // "no un nombre"
Exemple: Iterar Maps
amb for..of
Els mapes es poden iterar fent servir un bucle for..of
:
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "un");
for (var [key, value] of myMap) {
alert(key + " = " + value);
}
// Mostrarà 2 alertes; el primer amb "0 = zero" i el segon amb "1 = one"
for (var key of myMap.keys()) {
alert(key);
}
// Mostrarà 2 alertes; el primer amb "0" i el segon amb "1"
for (var value of myMap.values()) {
alert(value);
}
// Mostrarà 2 alertes; el primer amb "zero" i el segon amb "un"
for (var [key, value] of myMap.entries()) {
alert(key + " = " + value);
}
// Mostrarà 2 alertes; el primer amb "0 = zero" i el segon amb "1 = un"
myMap.forEach(function(value, key) {
alert(key + " = " + value);
}, myMap)
// Mostrarà 2 alertes; el primer amb "0 = zero" i el segon amb "1 = un"
Exemple: Relació amb els objectes Array
var kvArray = [["clau1", "valor1"], ["clau2", "valor2"]];
// Utilitzeu el constructor de Map normal per a transformar un Array 2D clau-valor en un mapa
var myMap = new Map(kvArray);
myMap.get("valor1"); // retorna "valor1"
// Utilitzeu l'operador spread per a transformar un mapa en un Array 2D clau-valor.
alert(uneval([...myMap])); // Mostrarà exactament el mateix Array que kvArray
// O bé utilitzeu l'operador spread a l'iterador de les claus o els valor per a obtenir
// un array de només les claus o els valors
alert(uneval([...myMap.keys()])); // Mostrarà ["clau1", "clau2"]
Especificacions
Especificació | Estat | Comentaris |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Map' in that specification. |
Standard | Definició inicial. |
Compatibilitat amb navegadors
Característica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suport bàsic |
31 [1] |
13 (13) | 11 | 25 | 7.1 |
Argument del constructor: new Map(iterable) |
38 | 13 (13) | No support | 25 | No support |
iterable | 38 | 17 (17) | No support | 25 | 7.1 |
Map.clear() |
31 [1] 38 |
19 (19) | 11 | 25 | 7.1 |
Map.keys(), Map.values(), Map.entries() |
37 [1] 38 |
20 (20) | No support | 25 | 7.1 |
Map.forEach() |
36 [1] 38 |
25 (25) | 11 | 25 | 7.1 |
Igualtat de claus per a -0 i 0 | 34 [1] 38 |
29 (29) | No support | 25 | No support |
Argument del constructor: new Map(null) |
(Yes) | 37 (37) | ? | ? | ? |
Monkey-patched set() al Constructor |
(Yes) | 37 (37) | ? | ? | ? |
Característica | Android | Chrome per Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | No support | 31 [1] 38 |
13.0 (13) | No support | No support | iOS 8 |
Argument del constructor: new Map(iterable) |
No support | 38 | 13.0 (13) | No support | No support | No support |
iterable | No support | No support | 17.0 (17) | No support | No support | iOS 8 |
Map.clear() |
No support | 31 [1] 38 |
19.0 (19) | No support | No support | iOS 8 |
Map.keys(), Map.values(), Map.entries() |
No support | 37 [1] 38 |
20.0 (20) | No support | No support | iOS 8 |
Map.forEach() |
No support | 36 [1] 38 |
25.0 (25) | No support | No support | iOS 8 |
Igualtat per a -0 i 0 | No support | 34 [1] 38 |
29.0 (29) | No support | No support | No support |
Argument del constructor: new Map(null) |
? | (Yes) | 37.0 (37) | ? | ? | ? |
Monkey-patched set() al Constructor |
? | (Yes) | 37.0 (37) | ? | ? | ? |
[1] The feature is available behind a preference. In chrome://flags
, activate the entry “Enable Experimental JavaScript”.