This is a new technology, part of the ECMAScript 2015 (ES6) standard.
This technology's specification has been finalized, but check the compatibility table for usage and implementation status in various browsers.
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
- 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
.
Propietats
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) | Not supported | 25 | Not supported |
iterable | 38 | 17 (17) | Not supported | 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) | Not supported | 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) | Not supported | 25 | Not supported |
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 | Not supported | 31 [1] 38 |
13.0 (13) | Not supported | Not supported | iOS 8 |
Argument del constructor: new Map(iterable) |
Not supported | 38 | 13.0 (13) | Not supported | Not supported | Not supported |
iterable | Not supported | Not supported | 17.0 (17) | Not supported | Not supported | iOS 8 |
Map.clear() |
Not supported | 31 [1] 38 |
19.0 (19) | Not supported | Not supported | iOS 8 |
Map.keys(), Map.values(), Map.entries() |
Not supported | 37 [1] 38 |
20.0 (20) | Not supported | Not supported | iOS 8 |
Map.forEach() |
Not supported | 36 [1] 38 |
25.0 (25) | Not supported | Not supported | iOS 8 |
Igualtat per a -0 i 0 | Not supported | 34 [1] 38 |
29.0 (29) | Not supported | Not supported | Not supported |
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”.