--- title: Map slug: Web/JavaScript/Reference/Global_Objects/Map tags: - ECMAScript2015 - JavaScript - Map translation_of: Web/JavaScript/Reference/Global_Objects/Map original_slug: Web/JavaScript/Referencia/Objetos_globales/Map ---
El objeto Map almacena pares clave/valor. Cualquier valor (tanto objetos como {{Glossary("Primitive", "valores primitivos")}}) pueden ser usados como clave o valor.
new Map([iterable])
iterableUn objeto Map puede iterar sobre sus elementos en orden de inserción. Un bucle for..of devolverá un array de [clave, valor] en cada iteración.
Cabe destacar que un Map el cual es un mapa de un objeto, especialmente un diccionario de diccionarios, solo se va a mapear en el orden de inserción del objeto — el cual es aleatorio y no ordenado.
La igualdad de claves esta basada en el algoritmo "SameValueZero": NaN es considerado lo mismo que NaN (sin importar que NaN !== NaN) y todos los otros operadores son considerados iguales de acuerdo a la semantica del operador ===. En las primeras versiones de ECMAScript 6 -0 y +0 eran considarados distintos (even though -0 === +0), esto fue cambiado en posteriores versiones y ha sido implementado en Gecko 29 {{geckoRelease("29")}} ({{bug("952870")}}) and a recent nightly Chrome.
Los {{jsxref("Object", "Objetos")}} son similares a los Maps en cuanto a que ambos permiten establecer claves a valores, recuperar dichos valores, eliminar claves, y detectar si existe algo almacenado en una clave determinada. Por esto, los Objects han sido usados históricamente como Maps; no obstante, hay diferencias importantes entre Objects y Maps que hacen mejor usar un Map en la mayoría de casos.
Object son {{jsxref("String", "Strings")}} y {{jsxref("Symbol", "Symbols")}}, mientras que para un Map pueden ser de cualquier tipo, incluyendo funciones, objetos y cualquier otro tipo primitivo.Map usando la propiedad size, mientras que le número de propiedades en un Object tiene que ser deternminado manualmente.Map es un iterable lo que permite iterar directamente sobre el, mientras que si queremos iterar sobre un Object necesitamos obtener primero las claves de alguna forma para después iterar sobre el.Object tiene prototipo, por lo que hay claves por defecto en tu mapa que pueden colisionar con tus claves si no eres cuidadoso. En el estandard ES5 esto se puede evitar usando mapa = Object.create(null), pero esto raramente se hace.Map.lengthMap.Todas las instancias de Map heredan de {{jsxref("Map.prototype")}}.
{{page('es/docs/Web/JavaScript/Referencia/Objetos_globales/Map/prototype','Propiedades')}}
{{page('es/docs/Web/JavaScript/Referencia/Objetos_globales/Map/prototype','Métodos')}}
var miMapa = new Map();
var claveObj = {},
claveFunc = function () {},
claveCadena = "una cadena";
// asignando valores
miMapa.set(claveCadena, "valor asociado con 'una cadena'");
miMapa.set(claveObj, "valor asociado con claveObj");
miMapa.set(claveFunc, "valor asociado with claveFunc");
miMapa.size; // 3
// obteniendo los valores
miMapa.get(claveCadena); // "valor asociado con 'una cadena'"
miMapa.get(claveObj); // "valor asociado con claveObj"
miMapa.get(claveFunc); // "valor asociado con claveFunc"
miMapa.get("una cadena"); // ""valor asociado con 'una cadena'"
// porque claveCadena === 'una cadena'
miMapa.get({}); // undefined, porque claveObj !== {}
miMapa.get(function() {}) // undefined, porque claveFunc !== function () {}
NaN como claves de MapNaN también puede ser usado como una clave. Aún cuando cada clave NaN no es igual a sí misma (NaN !== NaN es verdadera), el siguiente ejemplo funciona, porque las claves NaNs NaNs no son distinguibles unas de otras:
var miMapa = new Map();
miMapa.set(NaN, "no es un número");
miMapa.get(NaN); // "no es un número"
var otroNaN = Number("foo");
miMapa.get(otroNaN); // "no es un número"
Map con for..ofLos Map pueden ser iterados usando un bucle for..of:
var miMapa = new Map();
miMapa.set(0, "cero");
miMapa.set(1, "uno");
for (var [clave, valor] of miMapa) {
alert(clave + " = " + valor);
}
// Mostrará 2 alertas; primero con "0 = cero" y segundo con "1 = uno"
for (var clave of miMapa.keys()) {
alert(clave);
}
// Mostrará 2 alertas; primero con "0" y segundo con "1"
for (var valor of miMapa.values()) {
alert(valor);
}
// Mostrará 2 alertas; primero con "cero" y segundo con "uno"
for (var [clave, valor] of miMapa.entries()) {
alert(clave + " = " + valor);
}
// Mostrará 2 alertas; primero con "0 = cero" y segundo con "1 = uno"
miMapa.forEach(function(valor, clave, miMapa) {
alert(clave + " = " + valor);
})
// Mostrará 2 alertas; primero con "0 = cero" y segundo con "1 = uno"
Maps usando forEach()Los Map pueden ser iterados usando el método forEach():
miMapa.forEach(function(valor, clave) {
console.log(clave + ' = ' + valor);
});
// Mostrará 2 logs; el primero con "0 = cero" y el segundo con "1 = uno"
Arrayvar kvArray = [["clave1", "valor1"], ["clave2", "valor2"]];
// El constructor por defecto de Map para transforar un Array 2D (clave-valor) en un mapa
var miMapa = new Map(kvArray);
miMapa.get("clave1"); // devuelve "valor1"
// Usando la función Array.from para transformar el mapa a un Array 2D clave-valor.
console.log(Array.from(miMapa)); // Muestra exactamente el mismo Array que kvArray
// O usando los iteradores de claves o valores y convirtiendo a array.
console.log(Array.from(miMapa.keys())); // Muestra ["clave1", "clave2"]
| Especificación | Estado | Comentario |
|---|---|---|
| {{SpecName('ES6', '#sec-map-objects', 'Map')}} | {{Spec2('ES2015')}} | Definición inicial. |
| {{SpecName('ESDraft', '#sec-map-objects', 'Map')}} | {{Spec2('ESDraft')}} |
La tabla de compatiblidad en esta página es generada desde datos estructurados. Si quieres contribuir a los datos, pro favor mira https://github.com/mdn/browser-compat-data y envianos una solicitud de pull request.
{{Compat("javascript.builtins.Map")}}