WeakMap и WeakSet
Автор: admin
Дата: 13.09.2020 02:06
WeakMap — коллекция пар ключ/значение. В качестве ключей могут быть использованы только объекты, а значения могут быть произвольных типов. WeakSet - коллекция, элементами которой могут быть только объекты. Ссылки на эти объекты в WeakSet являются слабыми. Каждый объект может быть добавлен в WeakSet только один раз.
WeakMap
WeakMap произошли из Map, поэтому они очень похожи друг на друга. Однако WeakMap есть одно большое отличие.
Первое отличие от Map ключ должен быть объектом:
const John = { name: 'John' };
const weakMap = new WeakMap();
weakMap.set(John, 'student');
// WeakMap {{...} => "student"}
weakMap.set('john', 'student');
// Uncaught TypeError: Invalid value used as weak map key
Вы можете передать в Map объект любое значение в качестве ключа , но WeakMap это другое значение. Он принимает только объект в качестве ключа; в противном случае возвращается ошибка.
Второе отличие от Map Вы можете использовать WeakMap следующие методы: delete, get, has, set, WeakMap что не поддерживаются методы итерации объекта.
Третья разница в том что данные удаляются, когда сборщик мусора очищает ссылку это самая большая разница по сравнению с Map.
let John = { major: "math" };
const map = new Map();
const weakMap = new WeakMap();
map.set(John, 'John');
weakMap.set(John, 'John');
John = null;
/* John is garbage-collected */
Когда John объект собирается сборщиком мусора, Map объект сохраняет ссылочную ссылку, в то время как WeakMap объект теряет ссылку. Поэтому при использовании WeakMap необходимо учитывать эту функцию.
WeakSet
WeakSet также теряют ссылку доступа к внутренним данным, если они собираются сборщиком мусора.
let John = { major: "math" };
const set = new Set();
const weakSet = new WeakSet();
set.add(John);
weakSet.add(John);
John = null;
// John is garbage-collected
После того, как объект был John обработан сборщиком мусора, у WeakSet него нет возможности получить доступ к данным, на которые он ссылался John. И WeakSet не поддерживает for-of или, forEach поскольку он не повторяется.