diff --git a/files/es/web/javascript/reference/global_objects/map/index.md b/files/es/web/javascript/reference/global_objects/map/index.md new file mode 100644 index 00000000000000..ca26f6a4a0d068 --- /dev/null +++ b/files/es/web/javascript/reference/global_objects/map/index.md @@ -0,0 +1,503 @@ +--- +title: Map +slug: Web/JavaScript/Reference/Global_Objects/Map +l10n: + sourceCommit: 8421c0cd94fa5aa237c833ac6d24885edbc7d721 +--- + +{{JSRef}} + +El objeto **`Map`** retiene tuplas de llave-valor y mantiene el orden de inserción de las llaves. +Cualquier valor (ambos objetos y {{Glossary("Primitive", "valores primitivos")}}) puede ser usado como llave o valor. + +{{EmbedInteractiveExample("pages/js/map.html", "taller")}} + +## Descripción + +Los objetos `Map` son colecciones de tuplas tipo llave-valor. Una llave en `Map` **puede aparecer solo una vez**; es única en la colección de `Map`. Un objeto `Map` es iterado por sus tuplas llave-valor —un bucle {{jsxref("Statements/for...of", "for...of")}} regresa un arreglo de `[llave, valor]` por cada iteración. La iteración sucede en _orden de inserción_, la cual corresponde al orden en el que cada tupla llave-valor fue incertada inicialmente en el _map_ por el método [`set()`](/es/docs/Web/JavaScript/Reference/Global_Objects/Map/set) (eso es, si no había una llave con el mismo valor en el map, cuando `set()` fué llamado). + +La especificación requiere que los _maps_ sean implementados "que, en promedio, proporcione tiempos de acceso que sean sublineales al numero de elementos en la colección". Por lo tanto, podría ser representado internamente como una tabla hash (con una busqueda O(1)), un árbol de búsqueda (con una busqueda de O(log(N))), o cualquier otra estructura de datos, mientras la complejidad sea mejor que O(N). + +### Igualdad de llaves + +La igualdad de valores se basa en el algoritmo [Igualdad SameValueZero](/es/docs/Web/JavaScript/Equality_comparisons_and_sameness#igualdad_same-value-zero). (Se solía usar [igualdad SameValue](/es/docs/Web/JavaScript/Equality_comparisons_and_sameness#igualdad_same-value), el cual trataba `0` y `-0` como diferentes. Revise [compatibilidad con navegadores](#compatibilidad_con_navegadores).) Lo que significa que {{jsxref("NaN")}} es conciderado lo mismo que `NaN` (a pesar de que `NaN !== NaN`) y todos los otros valores son conciderados iguales, de acuerdo a la semantica del operador `===`. + +### Objects vs. Maps + +{{jsxref("Object")}} es similar a `Map`—ambos te permiten asignar llaves a valores, recuperar esos valores, borrar llaves, y detectar si hay algo guardado en una llave. Por esta razón (y porque no había alternativas incorporadas), históricamente `Object` se ha usado como `Map`. + +Sin embargo, hay diferencias importantes que hacen que se prefiera a `Map` en algunos casos: + +
+ | Map | +Object | +
---|---|---|
Llaves accidentales | +
+ Un objeto Map no tiene llaves por defecto. Sólo contiene lo que explicitamente se pone en él.
+ |
+
+
+ Un objeto
+
+ + Nota: Esto se puede evitar usando {{jsxref("Object.create", "Object.create(null)")}}, + pero raramente se hace. + + |
+
Seguridad | +
+ Un objeto Map es seguro de usar con llaves y valores proporcionados por el usuario.
+ |
+
+
+ Asignar tuplas de llave-valor proporcionadas por el usuario en un |
+
Tipos de llaves | +
+ Las llaves de un objeto Map pueden ser cualquier valor (incluyendo funciones,
+ objetos, o cualquier primitivo).
+ |
+
+ Las llaves de un objeto Object deben ser {{jsxref("String")}} o un {{jsxref("Symbol")}}.
+ |
+
Orden de las llaves | +
+
+ Las llaves en un objeto |
+
+
+ A pesar de que ahora las llaves de un objeto común
+ El orden en ECMAScript 2015 fué definido inicialmente para las propiedades propias del objeto; ECMAScript 2020 define un orden también para propiedades heredadas. Pero nótese que ningún mecanismo único itera todas las propiedades de un objeto; de los varios mecanismos, cada uno inluye un subconjunto diferente de propiedades; ({{jsxref("Statements/for...in", "for-in")}}
+ incluye sólo propiedades donde la llave es una cadena de texto enumerable;
+ {{jsxref("Object.keys")}} incluye sólo propiedades propias, enumerables,
+ y las llaves son cadenas de texto;
+ {{jsxref("Object.getOwnPropertyNames")}} incluye propias,
+ llaves de cadena de texto incluso si no son enumerables;
+ {{jsxref("Object.getOwnPropertySymbols")}} hace lo mismo sólo para propiedades que su llave es un |
+
Tamaño | +
+ El número de elementos en un Map se obtiene fácilmente de su propiedad
+ {{jsxref("Map.prototype.size", "size")}}.
+ |
+
+ Determinar el número de elementos en un Objeto es mas indirecto y menos eficiente. Una forma común de hacerlo es através de la propiedad {{jsxref("Array/length", "length")}} del arreglo que regresa la función {{jsxref("Object.keys()")}}.
+ |
+
Iteración | +
+ Un Map es un
+ iterable, así que puede ser iterado directamente.
+ |
+
+
+
+
+ Nota: +
|
+
Desempeño | +
+ + Se desempeña mejor en escenarios que involucran adiciones y eliminaciones frecuentes de tuplas llave-valor. + + |
+
+ + No está optimizado para adiciones y eliminaciones frequentes de tuplas llave-valor. + + |
+
Serialización y análisis de cadenas de texto | +
+ No tiene soporte nativo para serialización o análisis de cadenas de texto. +
+ (Pero puedes construir tu propio soporte para serialización y análisis de cadenas de texto para
+ |
+
+ + Tiene soporte nativo para serialización de {{jsxref("Object")}} a + JSON, usando {{jsxref("JSON.stringify()")}}. + ++ Tiene soporte nativo para análisis de cadenas de JSON a {{jsxref("Object")}}, + usando {{jsxref("JSON.parse()")}}. + + |
+