recorrer orientado objetos objeto lista crear buscar array agregar javascript ecmascript-6 javascript-objects

javascript - orientado - Mapas vs objetos en ES6, ¿cuándo usarlos?



map javascript (6)

Ref: Mapas MDN

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, y then / 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 son String sy Symbol s, mientras que pueden ser cualquier valor para un Map , 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 objeto Map devuelve claves en orden de inserción.
  • Puede obtener el tamaño de un Map fácilmente con la propiedad de size , mientras que el número de propiedades en un Object debe determinarse manualmente.
  • Un Map es iterable y, por lo tanto, puede iterarse directamente, mientras que iterar sobre un Object 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 puede map = Object.create(null) usando map = 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.

MDN