From e592ee7d56986d4366f9006d7bb90e450cb817e1 Mon Sep 17 00:00:00 2001 From: Juan Vásquez Date: Tue, 22 Feb 2022 12:04:28 -0600 Subject: 18. Update weakmap [ES] (#4205) * 18. Update weakmap [ES] - [x] Change from HTML to MD - [x] Sync content Closes #4180 * Apply suggestions from code review Co-authored-by: Anderson Vallejo <48649209+Vallejoanderson@users.noreply.github.com> Co-authored-by: Alexander --- .../reference/global_objects/weakmap/index.html | 279 --------------------- .../reference/global_objects/weakmap/index.md | 147 +++++++++++ 2 files changed, 147 insertions(+), 279 deletions(-) delete mode 100644 files/es/web/javascript/reference/global_objects/weakmap/index.html create mode 100644 files/es/web/javascript/reference/global_objects/weakmap/index.md diff --git a/files/es/web/javascript/reference/global_objects/weakmap/index.html b/files/es/web/javascript/reference/global_objects/weakmap/index.html deleted file mode 100644 index 7d85820c1d..0000000000 --- a/files/es/web/javascript/reference/global_objects/weakmap/index.html +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: WeakMap -slug: Web/JavaScript/Reference/Global_Objects/WeakMap -tags: - - ECMAScript 2015 - - JavaScript - - WeakMap -translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap -original_slug: Web/JavaScript/Referencia/Objetos_globales/WeakMap ---- -
{{JSRef}}
- -

El objeto WeakMap es una colección de pares clave/valor en la que las claves son objetos y los valores son valores arbitrarios.

- -

Sintaxis

- -
new WeakMap([iterable])
-
- -

Parámetros

- -
-
iterable
-
Iterable es un Array u otro objeto iterable cuyos elementos son pares clave-valor (Arrays de dos elementos). Cada par clave-valor será añadido al nuevo WeakMap. null es tratado como undefined.
-
- -

Descripción

- -

Las claves de los WeakMaps solamente pueden ser del tipo Object. Los {{Glossary("Primitive", "Primitive data types")}} como claves no están permitidos (ej. un {{jsxref("Symbol")}} no pueden ser una clave de WeakMap).

- -

¿Por qué WeakMap?

- -

El programador de JavaScript experimentado se habrá dado cuenta que esta API podría ser implementada en JavaScript con dos arrays (uno para las claves, otro para los valores) compartidos por los cuatro métodos de la API. Dicha implementación habría tenido dos inconvenientes principales: El primero es una búsqueda O(n) (siendo n el número de claves en el mapa). El segundo es un problema de pérdida de memoria. Con mapas escritos manualmente, el array de las claves mantendría referencias a la objetos clave, impidiéndoles ser recolectados. En los WeakMap nativos, las referencias a los objetos clave son mantenidas "débilmente", lo que quiere decir que no impiden la recolección de basura en caso de que no haya otras referencias al objeto.

- -

Dado que las referencias son débiles, las claves de WeakMap no son enumerables (ej: no existe un método que te devuelva la lista de las claves). Si existiera, la lista dependería de la recolección de basura, introduciendo indeterminismo. Si quieres una lista de las claves, se debe usar un  {{jsxref("Map")}} o mantenerla tu mismo.

- -

Propiedades

- -
-
WeakMap.length
-
El valor de la propiedad length es 0.
-
{{jsxref("WeakMap.prototype")}}
-
Representa el prototipo para el nuevo constructor WeakMap. Permite añadir propiedades a todos los objetos WeakMap.
-
- -

Instancias de WeakMap

- -

Todas las instancias de WeakMap heredan de {{jsxref("WeakMap.prototype")}}.

- -

Propiedades

- -

{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}

- -

Métodos

- -

{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')}}

- -

Ejemplos

- -

Usando WeakMap

- -
var wm1 = new WeakMap(),
-    wm2 = new WeakMap(),
-    wm3 = new WeakMap();
-var o1 = {},
-    o2 = function(){},
-    o3 = window;
-
-wm1.set(o1, 37);
-wm1.set(o2, "azerty");
-wm2.set(o1, o2); // un valor puede ser cualquier cosa, incluidos objetos o funciones
-wm2.set(o3, undefined);
-wm2.set(wm1, wm2); // claves y valores pueden ser objetos cualesquiera. !Incluso WeakMaps!
-
-wm1.get(o2); // "azerty"
-wm2.get(o2); // undefined, porque no hay valor para o2 en wm2
-wm2.get(o3); // undefined, porque es es el valor del conjunto
-wm1.has(o2); // true
-wm2.has(o2); // false
-wm2.has(o3); // true (incluso si el valor es 'undefined')
-
-wm3.set(o1, 37);
-wm3.get(o1); // 37
-
-wm1.has(o1);   // true
-wm1.delete(o1);
-wm1.has(o1);   // false
-
-
- -

Implementando una clase tipo-WeakMap con un método .clear()

- -

Con propósito expositivo, el siguiente ejemplo usa el nuevo costruct class  de ECMAScript 2015, que actualmente no ha sido implementado de forma amplia.

- -
class ClearableWeakMap {
-  constructor(init) {
-    this._wm = new WeakMap(init)
-  }
-  clear() {
-    this._wm = new WeakMap()
-  }
-  delete(k) {
-    return this._wm.delete(k)
-  }
-  get(k) {
-    return this._wm.get(k)
-  }
-  has(k) {
-    return this._wm.has(k)
-  }
-  set(k, v) {
-    this._wm.set(k, v)
-    return this
-  }
-}
-
- -

Especificaciones

- - - - - - - - - - - - - - - - -
EspecificaciónEstadoComentario
{{SpecName('ES2015', '#sec-weakmap-objects', 'WeakMap')}}{{Spec2('ES2015')}}Definición inicial.
- -

Compatibilidad de navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (SpiderMonkey)Internet ExplorerOperaSafari
Soporte básico36{{CompatGeckoDesktop("6.0")}}11{{ CompatOpera(23) }}7.1
new WeakMap(iterable)38{{CompatGeckoDesktop("36")}}{{CompatNo}}{{ CompatOpera(25) }}{{CompatNo}}
clear()36{{CompatGeckoDesktop("20.0")}}11{{ CompatOpera(23) }}7.1
Constructor argument: new WeakMap(null){{CompatVersionUnknown}}{{CompatGeckoDesktop("37")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
Monkey-patched set() in Constructor{{CompatVersionUnknown}}{{CompatGeckoDesktop("37")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
WeakMap() without new throws{{CompatVersionUnknown}}{{CompatGeckoDesktop("42")}}11{{CompatUnknown}}{{CompatUnknown}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (SpiderMonkey)IE MobileOpera MobileSafari Mobile
Soporte básico35{{CompatGeckoMobile("6.0")}}{{CompatNo}}{{CompatNo}}iOS 8
new WeakMap(iterable)38{{CompatGeckoMobile("36")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
clear()35{{CompatGeckoMobile("20.0")}}{{CompatNo}}{{CompatNo}}iOS 8
Constructor argument: new WeakMap(null){{CompatUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("37")}}{{CompatUnknown}}{{CompatUnknown}}
Monkey-patched set() in Constructor{{CompatUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("37")}}{{CompatUnknown}}{{CompatUnknown}}
WeakMap() without new throws{{CompatUnknown}}{{CompatGeckoMobile("42")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
-
- -

- -

Ver también

- - diff --git a/files/es/web/javascript/reference/global_objects/weakmap/index.md b/files/es/web/javascript/reference/global_objects/weakmap/index.md new file mode 100644 index 0000000000..b23b86c4fb --- /dev/null +++ b/files/es/web/javascript/reference/global_objects/weakmap/index.md @@ -0,0 +1,147 @@ +--- +title: WeakMap +slug: Web/JavaScript/Reference/Global_Objects/WeakMap +translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap +original_slug: Web/JavaScript/Referencia/Objetos_globales/WeakMap +browser-compat: javascript.builtins.WeakMap +--- +{{JSRef}} + +El objeto `WeakMap` es una colección de pares llave/valor en la que las llaves +deben ser objetos con valores de cualquier +[tipo de dato en JavaScript](/es/docs/Web/JavaScript/Data_structures#javascript_types), +y el cual no crea fuertes referencias a sus llaves. +Es decir, la presencia de un objeto como llave en un `WeakMap` no evita que el +objeto sea recolectado como basura. Una vez que se ha recopilado un objeto +utilizado como llave, sus valores correspondientes en cualquier `WeakMap` se +convierten en candidatos para la recolección de basura — siempre y cuando no se +les mencione fuertemente en otros lugares. + +`WeakMap` permite asociar datos a objectos de una manera que no impide que se +recopilen los objectos llaves, incluso si los valores hacen referencia a las llaves. +Sin embargo, un `WeakMap` no permite observar la vitalidad de sus llaves, por lo +que no permite la enumeración; Si un `WeakMap` expusiera algún método para obtener +una lista de sus llaves, la lista dependería del estado de la recolección de basura, +introduciendo indeterminismo. Si quieres una lista de llaves, +se debe usar un {{jsxref("Map")}} en lugar de un `WeakMap`. + +Puedes aprender más acerca de `WeakMap` en la sección de [objeto WeakMap](/es/docs/Web/JavaScript/Guide/Keyed_collections#weakmap_object) +de la guía [colecciónes con llaves](/es/docs/Web/JavaScript/Guide/Keyed_collections) + +## Descripción + +Las llaves de los WeakMaps solamente pueden ser del tipo `Object`. Los {{Glossary("Primitive", "Primitive data types")}} como claves no están permitidos (ej. un {{jsxref("Symbol")}} no pueden ser una clave de `WeakMap`). + +### ¿Por qué *Weak*Map? + +Una API de mapeo _podría_ ser implementada en JavaScript con dos arreglos (uno para las llaves, otro para los valores) compartidos por los cuatro métodos de la API. +Establecer elementos en este mapa implicaría colocar una llave y valor al final de cada uno de los arreglos simultáneamente. +Como resultado, los índices de la llave y el valor corresponderían a ambas matrices. +Obtener valores del mapa implicaría iterar a través de todas las llaves hasta encontrar una coincidencia, luego usar el índice de esta coincidencia para recuperar el valor correspondiente del arreglo de valores. + +Tal implementación tendría dos inconvenientes principales: + +1. El primero es una búsqueda *O(*n*)* (siendo _n_ el número de claves en el mapa) ya que ambas operaciones deben iterar a través de la lista de llaves para encontrar un valor coincidente. +2. El segundo inconveniente es un problema de pérdida de memoria por que los arreglos se aseguran que las referencias a cada llave y cada valor se mantengan indefinidamente. Estas referencias evitan que las llaves se recopilen como basura, incluso si no hay otras referencias al objeto. Esto también evitaría que los valores correspondientes se recopilen como basura. + +Por el contrario, en un `WeakMap`, un objeto llave se refiere fuertemente a su contenido siempre que la llave no se recolecte como basura, pero débilmente a partir de ese momento. Como tal, un `WeakMap`: + +- No evita la recolección de elementos no utilizados, lo que eventualmente elimina las referencias a la llave del objeto. +- Permite la recolección de basura de cualquier valor si no se hace referencia a sus objectos llave desde otro lugar que no sea un `WeakMap`. + +`WeakMap` puede ser una construcción particularmente útil cuando se asignan llaves a información sobre la llave que es valiosa _solo si_ la llave no ha sido recolectada como basura. + +Pero debido a que un `WeakMap` no permite observar la vida de sus llaves, sus llaves no son enumerables. No existe ningún método para obtener una lista de las llaves. Si lo hubiera, la lista dependería del estado de recolección de basura, introduciendo indeterminismo. Si desea tener una lista de llaves, debe usar {{jsxref("Map")}}. + +## Constructor + +- {{jsxref("WeakMap/WeakMap", "WeakMap()")}} + - : Crea un nuevo objeto `WeakMap`. + +## Métodos de instanciación + +- {{jsxref("WeakMap.delete", "WeakMap.prototype.delete(key)")}} + - : Elimina cualquier valor asociado a la `key`. `WeakMap.prototype.has(key)` regresará `false` después. +- {{jsxref("WeakMap.get", "WeakMap.prototype.get(key)")}} + - : Regresa el valor asociado a la `key`, o `undefined` si no hay ninguno. +- {{jsxref("WeakMap.has", "WeakMap.prototype.has(key)")}} + - : Devuelve un valor booleano que afirma si se ha asociado un valor a la `key` en el objeto `WeakMap` o no. +- {{jsxref("WeakMap.set", "WeakMap.prototype.set(key, value)")}} + - : Establece el `value` para la `key` en el objeto `WeakMap`. Devuelve el objeto `WeakMap`. + +## Ejemplos + +### Usando WeakMap + +```js +const wm1 = new WeakMap(), + wm2 = new WeakMap(), + wm3 = new WeakMap(); +const o1 = {}, + o2 = function () {}, + o3 = window; + +wm1.set(o1, 37); +wm1.set(o2, "azerty"); +wm2.set(o1, o2); // El valor puede ser cualquier cosa, incluyendo un objeto o una función +wm2.set(o3, undefined); +wm2.set(wm1, wm2); // Las llaves y los valores pueden ser cualquier objeto. ¡Incluso WeakMaps! + +wm1.get(o2); // "azerty" +wm2.get(o2); // undefined, porque no hay llave para `o2` en `wm2` +wm2.get(o3); // undefined, porque ese es el valor estabecido + +wm1.has(o2); // true +wm2.has(o2); // false +wm2.has(o3); // true (incluso si el valor en sí es 'undefined') + +wm3.set(o1, 37); +wm3.get(o1); // 37 + +wm1.has(o1); // true +wm1.delete(o1); +wm1.has(o1); // false +``` + +### Implementando una clase tipo-WeakMap con el método .clear() + +```js +class ClearableWeakMap { + constructor(init) { + this._wm = new WeakMap(init); + } + clear() { + this._wm = new WeakMap(); + } + delete(k) { + return this._wm.delete(k); + } + get(k) { + return this._wm.get(k); + } + has(k) { + return this._wm.has(k); + } + set(k, v) { + this._wm.set(k, v); + return this; + } +} +``` + +## Especificaciones + +{{Specifications}} + +## Compatibilidad con navegadores + +{{Compat}} + +## Véase también + +- [Polyfill de `WeakMap` en `core-js`](https://github.com/zloirock/core-js#weakmap) +- [Objetos WeakMap](/es/docs/Web/JavaScript/Guide/Keyed_collections#weakmap_object) en guía de [colecciónes con llaves](/es/docs/Web/JavaScript/Guide/Keyed_collections) +- [Ocultar detalles de implementación con ECMAScript 6 WeakMap](https://fitzgeraldnick.com/weblog/53/) +- {{jsxref("Map")}} +- {{jsxref("Set")}} +- {{jsxref("WeakSet")}} -- cgit v1.2.3-54-g00ecf