Utilice mapas sobre objetos cuando las claves sean desconocidas hasta el momento de la ejecución y cuando todas las claves sean del mismo tipo y todos los valores sean del mismo tipo.
Utilice objetos cuando haya una lógica que opere sobre elementos individuales.
Pregunta:
¿Cuál es un ejemplo aplicable del uso de mapas sobre objetos? en particular, "¿cuándo se desconocerán las claves hasta el tiempo de ejecución?"
var myMap = new Map();
var keyObj = {},
keyFunc = function () { return 'hey'},
keyString = "a string";
// 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");
console.log(myMap.get(keyFunc));
javascript
ecmascript-6
javascript-objects
Matthew Harwood
fuente
fuente

WeakMapque también podría ser útil.namey,idpor ejemplo.Respuestas:
Creo que ya ha dado un buen ejemplo: al menos necesita usar
Maps cuando está usando objetos (incluidos los objetos de función) como claves.Siempre que no se conozcan en el momento de la compilación. En resumen, siempre debe usar a
Mapcuando necesite una colección de valores clave . Un buen indicador de que necesita una colección es cuando agrega y elimina valores dinámicamente de la colección, y especialmente cuando no conoce esos valores de antemano (por ejemplo, son leídos de una base de datos, ingresados por el usuario, etc.).Por el contrario, debería utilizar objetos cuando sepa cuáles y cuántas propiedades tiene el objeto mientras escribe el código, cuando su forma es estática. Como lo ha dicho @Felix: cuando necesitas un registro . Un buen indicador de la necesidad es cuando los campos tienen diferentes tipos y cuando nunca es necesario utilizar la notación entre corchetes (o esperar un conjunto limitado de nombres de propiedades).
fuente
for..of) en lugar del nivel de programa (por ejemplofor..in) utilice aMap. Más información sobre estos términos en esta respuesta .Creo que con ES2015
Mapsolo quedan dos razones para usar objetos planos:¿Cuándo no es importante el orden de propiedad?
Promise, que es un proxy para un valor futuro, ythen/catch)En todos los demás casos, podría considerar usarlo
Map, porque conserva el orden de las propiedades y separa el programa (todas las propiedades asignadas alMapobjeto) del nivel de datos (todas las entradas en elMapmismo).¿Cuáles son los inconvenientes de
Map?fuente
Mapes probablemente más rápido, porque se basa puramente en un hash, mientras queObjectes un poco más complicado. ¡Gracias!No tengo idea de por qué alguien escribiría algo tan obviamente mal. Tengo que decir que la gente encuentra cada vez más contenido incorrecto y / o cuestionable en MDN en estos días.
Nada en esa oración es correcto. La razón principal para usar mapas es cuando desea claves con valores de objeto. La idea de que los valores deberían ser del mismo tipo es absurda, aunque podría serlo, por supuesto. La idea de que uno no debería usar objetos cuando las claves son desconocidas hasta el tiempo de ejecución es igualmente absurda.
fuente
Mapesté disponible) es un buen consejo.Una de las diferencias entre
MapyObjectes:Mappuede utilizar tipos de datos complejos como clave. Me gusta esto:const fn = function() {} const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]); m.get(document.body) // 'stackoverflow' m.get(fn) //'redis'cuidado: para tipos de datos complejos, si desea obtener el valor, debe pasar la misma referencia que la clave.
Object, solo acepta el tipo de datos simple (number,string) como clave.const a = {}; a[document.body] = 'stackoverflow'; console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}fuente
Esta pregunta es un duplicado de pero hasta que esté cerrado, aquí está mi respuesta desde allí :
Además de las otras respuestas, descubrí que los mapas son más difíciles de manejar y más detallados para operar que los objetos.
obj[key] += x // vs. map.set(map.get(key) + x)Esto es importante, porque el código más corto es más rápido de leer, más directamente expresivo y mejor mantenido en la cabeza del programador .
Otro aspecto: como set () devuelve el mapa, no el valor, es imposible encadenar asignaciones.
foo = obj[key] = x; // Does what you expect foo = map.set(key, x) // foo !== x; foo === mapLa depuración de mapas también es más dolorosa. A continuación, no puede ver qué claves hay en el mapa. Tendrías que escribir código para hacer eso.
Los objetos pueden ser evaluados por cualquier IDE:
fuente
ObjectLos s son similares a losMaps en el sentido de que ambos le permiten establecer claves en valores, recuperar esos valores, eliminar claves y detectar si algo está almacenado en una clave. Debido a esto (y porque no había alternativas integradas),Objects se han utilizado comoMaps históricamente; sin embargo, existen diferencias importantes que hacen que seaMappreferible usar un en ciertos casos:ObjectsonStrings ySymbols, mientras que pueden tener cualquier valor para aMap, incluidas funciones, objetos y cualquier primitiva.Mapestán ordenadas, mientras que las claves agregadas al objeto no. Por lo tanto, al iterar sobre él, unMapobjeto devuelve claves en el orden de inserción.Mapfácilmente con lasizepropiedad, mientras que el número de propiedades en unObjectdebe determinarse manualmente.Mapes iterable y, por lo tanto, se puede iterar directamente, mientras que iterar sobre unObjectrequiere obtener sus claves de alguna manera e iterar sobre ellas.Objecttiene un prototipo, por lo que hay claves predeterminadas en el mapa que podrían colisionar con sus claves si no tiene cuidado. A partir de ES5, esto se puede evitar mediante el usomap = Object.create(null), pero rara vez se hace.Mappuede funcionar mejor en escenarios que implican la adición y eliminación frecuentes de pares de claves.MDN
fuente