Szukaj…


Składnia

  • nowa WeakMap ([iterable]);
  • slabap.get (klucz);
  • słaby_map.set (klucz, wartość);
  • słaby_map. ma (klucz);
  • słaba mapa.delete (klucz);

Uwagi

Aby zapoznać się z zastosowaniami WeakMap, zobacz Jakie są rzeczywiste zastosowania ESak WeakMap? .

Tworzenie obiektu WeakMap

Obiekt WeakMap umożliwia przechowywanie par klucz / wartość. Różnica w stosunku do mapy polega na tym, że klucze muszą być obiektami i są słabo przywoływane. Oznacza to, że jeśli nie ma żadnych innych silnych odniesień do klucza, element WeakMap może zostać usunięty przez moduł odśmiecający.

Konstruktor WeakMap ma opcjonalny parametr, którym może być dowolny obiekt iterowalny (na przykład Array) zawierający pary klucz / wartość jako tablice dwuelementowe.

const o1 = {a: 1, b: 2},
      o2 = {};

const weakmap = new WeakMap([[o1, true], [o2, o1]]);

Uzyskiwanie wartości powiązanej z kluczem

Aby uzyskać wartość powiązaną z kluczem, użyj metody .get() . Jeśli z kluczem nie ma żadnej wartości, zwraca wartość undefined .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.get(obj1)); // 7
console.log(weakmap.get(obj2)); // undefined

Przypisywanie wartości do klucza

Aby przypisać wartość do klucza, użyj metody .set() . Zwraca obiekt WeakMap, dzięki czemu można łączyć wywołania .set() .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap();
weakmap.set(obj1, 1).set(obj2, 2);
console.log(weakmap.get(obj1)); // 1
console.log(weakmap.get(obj2)); // 2

Sprawdzanie, czy istnieje element z kluczem

Aby sprawdzić, czy element z określonym kluczem wychodzi z WeakMap, użyj metody .has() . Zwraca true jeśli wyjdzie, a w przeciwnym razie false .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.has(obj1)); // true
console.log(weakmap.has(obj2)); // false

Usuwanie elementu za pomocą klucza

Aby usunąć element z określonym kluczem, użyj metody .delete() . Zwraca true jeśli element istniał i został usunięty, w przeciwnym razie false .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.delete(obj1)); // true
console.log(weakmap.has(obj1)); // false
console.log(weakmap.delete(obj2)); // false

Słabe demo referencyjne

JavaScript wykorzystuje technikę liczenia referencji do wykrywania nieużywanych obiektów. Gdy liczba odwołań do obiektu wynosi zero, obiekt ten zostanie zwolniony przez moduł wyrzucający elementy bezużyteczne. Weakmap używa słabych odniesień, które nie przyczyniają się do liczenia odniesień do obiektu, dlatego bardzo przydatne jest rozwiązywanie problemów z wyciekiem pamięci.

Oto demo słabej mapy. Używam bardzo dużego obiektu jako wartości, aby pokazać, że słabe odniesienie nie przyczynia się do liczenia odniesień.

// manually trigger garbage collection to make sure that we are in good status.
> global.gc(); 
undefined

// check initial memory use,heapUsed is 4M or so
> process.memoryUsage(); 
{ rss: 21106688,
  heapTotal: 7376896,
  heapUsed: 4153936,
  external: 9059 }

> let wm = new WeakMap();
undefined

> const b = new Object();
undefined

> global.gc();
undefined

// heapUsed is still 4M or so
> process.memoryUsage(); 
{ rss: 20537344,
  heapTotal: 9474048,
  heapUsed: 3967272,
  external: 8993 }

// add key-value tuple into WeakMap,
// key is b,value is 5*1024*1024 array 
> wm.set(b, new Array(5*1024*1024));
WeakMap {}

// manually garbage collection
> global.gc();
undefined

// heapUsed is still 45M
> process.memoryUsage(); 
{ rss: 62652416,
  heapTotal: 51437568,
  heapUsed: 45911664,
  external: 8951 }

// b reference to null
> b = null;
null

// garbage collection
> global.gc();
undefined

// after remove b reference to object,heapUsed is 4M again 
// it means the big array in WeakMap is released
// it also means weekmap does not contribute to big array's reference count, only b does.
> process.memoryUsage(); 
{ rss: 20639744,
  heapTotal: 8425472,
  heapUsed: 3979792,
  external: 8956 }


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow