--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap ---
Объект WeakMap
— коллекция пар ключ-значение. В качестве ключей могут быть использованы только объекты, а значения могут быть произвольных типов.
new WeakMap([iterable])
iterable
WeakMap
. Null
обрабатывается как undefined
.Ключами WeakMap могут быть только объекты. {{Glossary("Primitive", "Примитивы")}} в качестве ключей не допускаются (т.е. {{jsxref("Symbol")}} не может быть ключом WeakMap
).
Опытный JavaScript разработчик заметит, что map API можно реализовать на JavaScript c помощью двух массивов (один для ключей, второй для значений) и четырёх общих API методов. Установка элементов в этот map должна будет одновременно запушить ключи и значения. В результате индексы ключа и значения будут корректными. Получение значений с map потребует итерирование ключей, чтобы найти совпадение, а затем использование индекса этого соответствия для извлечения соответствующего значения из массива значений.
У такой реализации было бы два главных неудобства. Первым является O(n) поиск (где n — количество ключей в map), так как обе операции требуют итерирование списка ключей для нахождения совпадения. Вторым – проблема утечки памяти. В словарях, написанных вручную, массив с ключами будет хранить ссылки на объекты-ключи, не давая им быть помеченными сборщиком мусора. В нативных WeakMap
, ссылки на объекты-ключи хранятся «слабо», что означает то, что они не предотвратят сборку мусора в том случае, если других ссылок на объект не будет.
WeakMaps имеют “weak” («слабые») обращения к ключам объекта, а следовательно непрепятствие сборщику мусора, когда мы больше не имеем объекта-ключа. WeakMaps могут быть особенно полезными конструкциями при сопоставлении ключей с информацией о ключе, который ценен, только если ключ не был собран сборщиком мусора (Garbage collector).
Из-за того, что ссылки являются слабыми, ключи WeakMap
не перечисляемы (то есть нет метода, который возвращает список ключей). Иначе список бы зависел от состояния сбора мусора, представляя индетерминизм. Если вы хотите иметь список ключей, вам следует поддерживать его самостоятельно.
WeakMap.length
length
всегда равно 0.WeakMap
. Позволяет добавлять свойства всем объектам типа WeakMap
.WeakMap
Все экземпляры WeakMap
унаследованы от {{jsxref("WeakMap.prototype")}}.
{{page('ru/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}
{{page('ru/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')}}
WeakMap
const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const 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
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 } }
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('ES2015', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ES2015')}} | Изначальное определение. |
{{SpecName('ESDraft', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.WeakMap")}}