Сводка
Объект WeakMap — коллекция пар ключ-значение. В качестве ключей могут быть использованы только объекты, а значения могут быть произвольных типов.
Синтаксис
new WeakMap([iterable])
Параметры
iterable- Может быть массивом или любым другим итерируемым объектом, элементы которого являются парами ключ-значение (массивы из двух элементов). Каждая пара ключ-значение будет добавлена во вновь созданный экземпляр
WeakMap.Nullобрабатывается какundefined.
Описание
Ключами WeakMap могут быть только объекты. Примитивы в качестве ключей не допускаются (т.е. Symbol не может быть ключом WeakMap).
Почему WeakMap?
Опытный JavaScript разработчик заметит, что map API можно реализовать на JavaScript c помощью двух массивов (один для ключей, второй для значений) и четырех общих API методов. Установка элементов в этот map должна будет одновременно запушить ключи и значения. В результате индексы ключа и значения будут корректными. Получение значений с map потребует итерирование ключей, чтобы найти совпадение, а затем используя индекс этого соответствия для извлечь соответствующего значения из массива значений.
У такой реализации было бы два главных неудобства. Первым является O(n) поиск (где n — количество ключей в map), так как обе операции требуют итерирование списка ключей для нахождения совпадения. Вторым – проблема утечки памяти. В словарях, написанных вручную, массив с ключами будет хранить ссылки на объекты-ключи, не давая им быть помеченными сборщиком мусора. В нативных WeakMap, ссылки на объекты-ключи хранятся "слабо", что означает то, что они не предотвратят сборку мусора в том случае, если других ссылок на объект не будет.
WeakMaps имеют "weak" ("слабые") обращения к ключам объекта, что значит непрепятствие сборщику мусора, когда мы больше не имеет объекта-ключа. WeakMaps могут быть особенно полезными конструкциями при сопоставлении ключей с информацией о ключе, который ценен, только если ключ не был собран мусором.
Из-за того, что ссылки являются слабыми, ключи WeakMap не перечисляемы (то есть нет метода, который возвращает список ключей). Иначе список бы зависел от состояния сбора мусора, представляя индетерминизм. Если Вы хотите иметь список ключей, Вам следует поддерживать его самостоятельно.
Свойства
WeakMap.length- Значение свойства
lengthвсегда равно 0. WeakMap.prototype- Представляет прототип конструктора
WeakMap. Позволяет добавлять свойства всем объектам типаWeakMap.
Экземпляры WeakMap
Все экземпляры WeakMap унаследованы от WeakMap.prototype.
Свойства
Методы
Примеры
Использование объекта WeakMap
var wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap();
var o1 = {},
o2 = function(){},
o3 = window,
o4 = [1, 2, 3];
wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // значением может быть что угодно, включая объект или функцию
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // ключами и значениями могут быть объекты. Даже WeakMap-ами
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, нет значения для o2 в wm2
wm2.get(o3); // undefined, это установленное значение
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (даже если значение равно 'undefined')
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
Пример: Реализация класса WeakMap-like классв с методом .clear()
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
}
}
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'WeakMap' в этой спецификации. |
Стандарт | Изначальное определение. |
| ECMAScript Latest Draft (ECMA-262) Определение 'WeakMap' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Компьютеры | Мобильные | Server | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakMap | Chrome Полная поддержка 36 | Edge Полная поддержка 12 | Firefox Полная поддержка 6 | IE Полная поддержка 11 | Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 6 | Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
new WeakMap(iterable) | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
new WeakMap(null) | Chrome Полная поддержка Да | Edge Полная поддержка 12 | Firefox Полная поддержка 37 | IE Полная поддержка 11 | Opera ? | Safari Полная поддержка 8 | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 37 | Opera Android ? | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
WeakMap() without new throws | Chrome Полная поддержка Да | Edge Полная поддержка 12 | Firefox Полная поддержка 42 | IE Полная поддержка 11 | Opera Полная поддержка Да | Safari Полная поддержка 9 | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка 12 | Firefox Android Полная поддержка 42 | Opera Android Полная поддержка Да | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка 0.12 |
clear | Chrome Нет поддержки 36 — 43 | Edge Нет поддержки Нет | Firefox Нет поддержки 20 — 46 | IE Полная поддержка 11 | Opera Нет поддержки 25 — 30 | Safari Нет поддержки 8 — 9 | WebView Android Нет поддержки 37 — 43 | Chrome Android Нет поддержки 36 — 43 | Edge Mobile Нет поддержки Нет | Firefox Android Нет поддержки 20 — 46 | Opera Android Нет поддержки 25 — 30 | Safari iOS Нет поддержки 8 — 9 | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
delete | Chrome Полная поддержка 36 | Edge Полная поддержка 12 | Firefox
Полная поддержка
6
| IE Полная поддержка 11 | Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка Да | Firefox Android
Полная поддержка
6
| Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
get | Chrome Полная поддержка 36 | Edge Полная поддержка 12 | Firefox
Полная поддержка
6
| IE Полная поддержка 11 | Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка Да | Firefox Android
Полная поддержка
6
| Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
has | Chrome Полная поддержка 36 | Edge Полная поддержка 12 | Firefox
Полная поддержка
6
| IE Полная поддержка 11 | Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка Да | Firefox Android
Полная поддержка
6
| Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
prototype | Chrome Полная поддержка 36 | Edge Полная поддержка Да | Firefox Полная поддержка 6 | IE Полная поддержка 11 | Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка Да | Firefox Android Полная поддержка 6 | Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
set | Chrome Полная поддержка 36 | Edge Полная поддержка 12 | Firefox
Полная поддержка
6
| IE
Частичная поддержка
11
| Opera Полная поддержка 23 | Safari Полная поддержка 8 | WebView Android Полная поддержка 37 | Chrome Android Полная поддержка 36 | Edge Mobile Полная поддержка Да | Firefox Android
Полная поддержка
6
| Opera Android Полная поддержка 23 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка Да | nodejs
Полная поддержка
0.12
|
Легенда
- Полная поддержка
- Полная поддержка
- Частичная поддержка
- Частичная поддержка
- Нет поддержки
- Нет поддержки
- Совместимость неизвестна
- Совместимость неизвестна
- Нестандартная. Ожидается плохая кросс-браузерная поддержка.
- Нестандартная. Ожидается плохая кросс-браузерная поддержка.
- Устаревшая. Не следует использовать в новых веб-сайтах
- Устаревшая. Не следует использовать в новых веб-сайтах
- Смотрите замечания реализации.
- Смотрите замечания реализации.
- Пользователь должен сам включить эту возможность.
- Пользователь должен сам включить эту возможность.
Смотрите также