пропонувати правки
JavaScript WeakMap — словник, що не тримає ключі в пам'яті
WeakMap — словник із слабкими посиланнями на ключі: якщо на об'єкт-ключ більше ніхто не посилається, збирач сміття прибере і його, і запис у словнику.
автор: NagarD
правити
Загальний опис
Звичайний Map тримає свої ключі. Поклав туди DOM-елемент — і навіть після видалення елемента зі сторінки він лишиться живим у пам'яті, бо словник на нього посилається. Це класичний витік пам'яті.
WeakMap цього не робить: він не заважає збирачу сміття. Елемент зник зі сторінки — запис зник сам, без жодного delete().
Звідси два застосування: прив'язка даних до DOM-вузлів і приватні дані класу — властивість, до якої немає доступу ззовні, бо ключ (this) знає лише сам клас.
Платою за це є обмеження: ключі тільки об'єкти , перебрати WeakMap не можна, size немає. Це не колекція, а саме прив'язка — і саме тому вона безпечна.
автор: NagarD
правити
Нотатка
Перебрати WeakMap неможливо за задумом: вміст може зникнути будь-якої миті, тож стабільного списку ключів просто не існує.
автор: NagarD
правити
+ додати пораду чи нотатку
Синтаксис
const wm = new WeakMap();
методи
Переглядачі
Стаціонарні переглядачі
Мобільні переглядачі
Серверні переглядачі
Приклади
+ запропонувати свій приклад у пісочниці
Дані, прив'язані до елемента, зникають разом із ним.
HTML
<button>Клацни мене</button>
JS
const data = new WeakMap();
const button = document.querySelector('button');
data.set(button, { clicks: 0 });
button.addEventListener('click', () => {
const state = data.get(button);
state.clicks++;
console.log('Кліків:', state.clicks);
});
// приватні дані класу: ключ (this) знає лише сам клас
const secrets = new WeakMap();
class User {
constructor(password) {
secrets.set(this, { password });
}
check(input) {
return secrets.get(this).password === input;
}
}
const user = new User('таємниця');
console.log(user.check('таємниця')); // true
// видалиш елемент чи об'єкт — запис у WeakMap зникне сам, без витоку
автор: NagarD
Ваша версія — : після перевірки замінить чинну.
Нова порада чи нотатка — з'явиться на сторінці після перевірки.
Ваша версія секції « »: після перевірки замінить чинну.
Текст секції (markdown — передзаповнено чинним)
Як форматувати текст?
Пишемо
Виходить
**важливо***акцент*~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]]
Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org)
Посилання на чужий сайт.

Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру
Код усередині речення.
```css.card { display: grid }```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги.
Цитата на всю ширину абзацу.
Специфічність: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1][^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два||
Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішенняЗадайте контейнеру `display: grid`.||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок
Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.
Чому ця правка? (необов'язково, але дуже допомагає перевірці)
Ви гість — діють добові ліміти.
Увійдіть , щоб пропонувати без капчі.
Ваша версія опису « »: після перевірки замінить чинну.
Текст опису (markdown — передзаповнено чинним)
Як форматувати текст?
Пишемо
Виходить
**важливо***акцент*~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]]
Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org)
Посилання на чужий сайт.

Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру
Код усередині речення.
```css.card { display: grid }```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги.
Цитата на всю ширину абзацу.
Специфічність: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1][^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два||
Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішенняЗадайте контейнеру `display: grid`.||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок
Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.
Чому ця правка? (необов'язково, але дуже допомагає перевірці)
Ви гість — діють добові ліміти.
Увійдіть , щоб пропонувати без капчі.