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
WeakMap
que también podría ser útil.name
y,id
por ejemplo.Respuestas:
Creo que ya ha dado un buen ejemplo: al menos necesita usar
Map
s 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
Map
cuando 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
Map
solo 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 alMap
objeto) del nivel de datos (todas las entradas en elMap
mismo).¿Cuáles son los inconvenientes de
Map
?fuente
Map
es probablemente más rápido, porque se basa puramente en un hash, mientras queObject
es 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
Map
esté disponible) es un buen consejo.Una de las diferencias entre
Map
yObject
es:Map
puede 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 === map
La 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
Object
Los s son similares a losMap
s 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),Object
s se han utilizado comoMap
s históricamente; sin embargo, existen diferencias importantes que hacen que seaMap
preferible usar un en ciertos casos:Object
sonString
s ySymbol
s, mientras que pueden tener cualquier valor para aMap
, incluidas funciones, objetos y cualquier primitiva.Map
están ordenadas, mientras que las claves agregadas al objeto no. Por lo tanto, al iterar sobre él, unMap
objeto devuelve claves en el orden de inserción.Map
fácilmente con lasize
propiedad, mientras que el número de propiedades en unObject
debe determinarse manualmente.Map
es iterable y, por lo tanto, se puede iterar directamente, mientras que iterar sobre unObject
requiere obtener sus claves de alguna manera e iterar sobre ellas.Object
tiene 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.Map
puede funcionar mejor en escenarios que implican la adición y eliminación frecuentes de pares de claves.MDN
fuente