javascript - orientado - Mapas vs objetos en ES6, ¿cuándo usarlos?
map javascript (6)
Use mapas sobre objetos cuando las claves son desconocidas hasta el tiempo de ejecución, y cuando todas las claves son del mismo tipo y todos los valores son del mismo tipo.
Use objetos cuando haya lógica que opere en elementos individuales.
Pregunta:
¿Cuál es un ejemplo aplicable del uso de mapas sobre objetos? en particular, "¿cuándo se desconocen 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));
¿Cuál es un ejemplo aplicable del uso de mapas sobre objetos?
Creo que ya ha dado un buen ejemplo: al menos necesita usar
Map
s cuando usa objetos (incluidos objetos Function) como teclas.
en particular, "¿cuándo se desconocen las claves hasta el tiempo de ejecución?"
Cuando no se conocen en tiempo de compilación.
En resumen, siempre debe usar un
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, entradas del usuario, etc.).
Por el contrario, debe usar 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 dijo @Felix: cuando necesitas un record . Un buen indicador de la necesidad de esto es cuando los campos tienen diferentes tipos, y cuando nunca necesita usar la notación de corchetes (o esperar un conjunto limitado de nombres de propiedades).
Use mapas sobre objetos cuando las claves son desconocidas hasta el tiempo de ejecución, y cuando todas las claves son del mismo tipo y todos los valores son del mismo tipo.
No tengo idea de por qué alguien escribiría algo tan obviamente equivocado. 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 pueden serlo, por supuesto. La idea de que uno no debe usar objetos cuando las claves son desconocidas hasta que el tiempo de ejecución es igualmente absurdo.
Creo que con el
Map
de ES2015 solo quedan dos razones para usar objetos simples:
- No desea iterar sobre las propiedades de un tipo de objeto en absoluto
- o lo hace, pero el orden de las propiedades no importa y puede distinguir el programa del nivel de datos al iterar
¿Cuándo no es importante el orden de la propiedad?
-
si solo tiene un valor único y algunas funciones que deberían asociarse explícitamente con él (como
Promise
, que es un proxy para un valor futuro, ythen
/catch
) - si tiene una estructura de datos de tipo estructura / registro con un conjunto estático de propiedades conocidas en "tiempo de compilación" (generalmente las estructuras / registros no son iterables)
En todos los demás casos, puede considerar usar
Map
, porque conserva el orden de las propiedades y separa el programa (todas las propiedades asignadas al objeto
Map
) del nivel de datos (todas las entradas en el
Map
).
¿Cuáles son los inconvenientes de
Map
?
- pierde la sintaxis literal del objeto conciso
- necesita reemplazos personalizados para JSON.stringyfy
- pierde la desestructuración, que de todos modos es más útil con estructuras de datos estáticos
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 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 guardado en la cabeza del programador .
Otro aspecto: debido a que set () devuelve el mapa, no el valor, es imposible encadenar las 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é teclas hay en el mapa. Tendrías que escribir código para hacer eso.
Los objetos pueden ser evaluados por cualquier IDE:
Una de las diferencias entre
Map
y
Object
es:
Map
puede usar un tipo de datos complejo como clave.
Me gusta esto:
const fn = function() {}
const m = new Map([[document.body, ''''], [fn, ''redis'']]);
m.get(document.body) // ''''
m.get(fn) //''redis''
cuidado: para los 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 su clave.
const a = {};
a[document.body] = '''';
console.log(a) //{[object HTMLBodyElement]: ""}
Object
son similares a los
Map
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 incorporadas), los
Object
se han utilizado históricamente como
Map
;
sin embargo, existen diferencias importantes que hacen que el uso de un
Map
preferible en ciertos casos:
-
Las claves de un
Object
sonString
sySymbol
s, mientras que pueden ser cualquier valor para unMap
, incluidas funciones, objetos y cualquier primitivo. -
Las claves en el
Map
se ordenan mientras que las claves agregadas al objeto no. Por lo tanto, al iterar sobre él, un objetoMap
devuelve claves en orden de inserción. -
Puede obtener el tamaño de un
Map
fácilmente con la propiedad desize
, mientras que el número de propiedades en unObject
debe determinarse manualmente. -
Un
Map
es iterable y, por lo tanto, puede iterarse directamente, mientras que iterar sobre unObject
requiere obtener sus claves de alguna manera e iterar sobre ellas. -
Un
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 puedemap = Object.create(null)
usandomap = Object.create(null)
, pero esto rara vez se hace. -
Un
Map
puede funcionar mejor en escenarios que implican la adición y eliminación frecuente de pares de claves.