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 поскольку он не повторяется.