Сводка

Объект 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' в этой спецификации.
Черновик  

 

Совместимость с браузерами

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
WeakMapChrome Полная поддержка 36Edge Полная поддержка 12Firefox Полная поддержка 6IE Полная поддержка 11Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
new WeakMap(iterable)Chrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 36IE Нет поддержки НетOpera Полная поддержка 25Safari Полная поддержка 9WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 36Opera Android Полная поддержка 25Safari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
new WeakMap(null)Chrome Полная поддержка ДаEdge Полная поддержка 12Firefox Полная поддержка 37IE Полная поддержка 11Opera Полная поддержка ДаSafari Полная поддержка 8WebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка 37Opera Android ? Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
WeakMap() without new throwsChrome Полная поддержка ДаEdge Полная поддержка 12Firefox Полная поддержка 42IE Полная поддержка 11Opera Полная поддержка ДаSafari Полная поддержка 9WebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка 42Opera Android Полная поддержка ДаSafari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
clear
УстаревшаяНестандартная
Chrome Нет поддержки 36 — 43Edge Нет поддержки НетFirefox Нет поддержки 20 — 46IE Полная поддержка 11Opera Нет поддержки 25 — 30Safari Нет поддержки 8 — 9WebView Android Нет поддержки 37 — 43Chrome Android Нет поддержки 36 — 43Firefox Android Нет поддержки 20 — 46Opera Android Нет поддержки 25 — 30Safari iOS Нет поддержки 8 — 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
deleteChrome Полная поддержка 36Edge Полная поддержка 12Firefox Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Полная поддержка 11Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
getChrome Полная поддержка 36Edge Полная поддержка 12Firefox Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.
IE Полная поддержка 11Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.
Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
hasChrome Полная поддержка 36Edge Полная поддержка 12Firefox Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Полная поддержка 11Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
prototypeChrome Полная поддержка 36Edge Полная поддержка ДаFirefox Полная поддержка 6IE Полная поддержка 11Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
setChrome Полная поддержка 36Edge Полная поддержка 12Firefox Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Частичная поддержка 11
Замечания
Частичная поддержка 11
Замечания
Замечания Returns 'undefined' instead of the 'Map' object.
Opera Полная поддержка 23Safari Полная поддержка 8WebView Android Полная поддержка 37Chrome Android Полная поддержка 36Firefox Android Полная поддержка 6
Замечания
Полная поддержка 6
Замечания
Замечания Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Полная поддержка 24Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.

Легенда

Полная поддержка  
Полная поддержка
Частичная поддержка  
Частичная поддержка
Нет поддержки  
Нет поддержки
Совместимость неизвестна  
Совместимость неизвестна
Нестандартная. Ожидается плохая кросс-браузерная поддержка.
Нестандартная. Ожидается плохая кросс-браузерная поддержка.
Устаревшая. Не следует использовать в новых веб-сайтах
Устаревшая. Не следует использовать в новых веб-сайтах
Смотрите замечания реализации.
Смотрите замечания реализации.
Пользователь должен сам включить эту возможность.
Пользователь должен сам включить эту возможность.

Смотрите также

 

 

 

Метки документа и участники

Внесли вклад в эту страницу: lexxl, YozhEzhi, mdnwebdocs-bot, kan.a, icw82, zamuka, RumyantsevMichael, casfcitizen, restrry, shvaikalesh, hellboy81
Обновлялась последний раз: lexxl,