WeakMap

Mapa z obiektami jako kluczami, która nie zatrzymuje ich w pamięci: wpis znika razem z nieużywanym obiektem.

Zwraca
Nowy obiekt WeakMap.
Na tej stronie

Przykład

#
JavaScript
const visits = new WeakMap()

function trackVisit(user) {
  visits.set(user, (visits.get(user) ?? 0) + 1)
  return visits.get(user)
}

const ania = { name: 'Ania' }
trackVisit(ania)

console.log(trackVisit(ania))
console.log(visits.has({ name: 'Ania' }))
Konsola
2
false

Definicja i zastosowanie

#

WeakMap działa podobnie do Map, ale służy do przypisywania danych do obiektów: kluczami są obiekty, a próba użycia napisu czy liczby kończy się błędem TypeError. Mapa trzyma klucze „słabo”: gdy w programie nie ma już żadnego innego odwołania do obiektu użytego jako klucz, silnik JavaScript może usunąć go z pamięci razem z przypisaną wartością.

Dzięki temu WeakMap dobrze nadaje się do dołączania dodatkowych danych do obiektów, których nie kontrolujesz, na przykład elementów DOM albo obiektów z biblioteki, bez ryzyka wycieku pamięci. Gdy element zostanie usunięty ze strony i zapomniany, jego dane też znikną.

WeakMap ma tylko cztery metody: set(), get(), has() i delete(). Nie ma size, clear() ani sposobu na przejście po wpisach, bo jej zawartość może się zmienić w każdej chwili w wyniku sprzątania pamięci. Jeśli potrzebujesz listy wszystkich wpisów, użyj zwykłej Map.

Składnia

#
Składnia
new WeakMap()
new WeakMap(iterable)

weakMap.set(key, value)
weakMap.get(key)
weakMap.has(key)
weakMap.delete(key)

Parametry

#
  • iterable

    opcjonalny

    Tablica par [obiekt, wartość], którymi mapa zostanie wypełniona na start.

Więcej przykładów

#
Napis nie może być kluczem
JavaScript
const cache = new WeakMap()

try {
  cache.set('Ania', 1)
} catch (error) {
  console.log(error.name)
}

console.log(cache)
Konsola
TypeError
WeakMap {}
Dane ukryte poza obiektem
JavaScript
const passwords = new WeakMap()

class Account {
  constructor(login, password) {
    this.login = login
    passwords.set(this, password)
  }

  checkPassword(attempt) {
    return passwords.get(this) === attempt
  }
}

const account = new Account('ania', 'tajne123')
console.log(account)
console.log(account.checkPassword('tajne123'))
Konsola
Account { login: 'ania' }
true

Hasło nie jest właściwością obiektu, więc nie widać go w konsoli ani w Object.keys(). W nowych klasach ten sam efekt daje prywatne pole #password.

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Używaj WeakMap do pamięci podręcznej i danych przypiętych do obiektów, które mogą zniknąć, np. elementów DOM.
  • W nowych klasach do ukrywania danych wygodniejsze są pola prywatne #pole.
  • Jeśli potrzebujesz size, listy kluczy albo pętli po wpisach, wybierz zwykłą Map.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.