WeakMap и WeakSet

31-03-24 07:55:43


Image for the WeakMap и WeakSet

WeakMap

WeakMap - это коллекция пар ключ-значение, где ключи слабо ссылочные. Это означает, что если нет других ссылок на ключевой объект, его можно собрать сборщиком мусора. Ключи WeakMap должны быть объектами, а значения могут быть произвольными значениями.

let weakMap = new WeakMap();
let key = {};
let value = "some value";
weakMap.set(key, value);
console.log(weakMap.get(key)); // Вывод: "some value"

WeakSet

WeakSet - это коллекция уникальных объектов, где ссылки на объекты 'слабо держатся'. Это означает, что если нет других ссылок на объект в WeakSet, его можно собрать сборщиком мусора.

let weakSet = new WeakSet();
let obj1 = {};
let obj2 = {};
weakSet.add(obj1);
weakSet.add(obj2);
console.log(weakSet.has(obj1)); // Вывод: true
weakSet.delete(obj1);
console.log(weakSet.has(obj1)); // Вывод: false

Различия между Map/Set и WeakMap/WeakSet

Основное различие между Map/Set и WeakMap/WeakSet заключается в том, как они обрабатывают ссылки на объекты. В Map/Set ссылки на объекты являются сильными, что означает, что пока Map/Set существует, объект не будет собран мусором, даже если он не используется в другом месте программы. В отличие от этого, WeakMap/WeakSet позволяет объектам быть собранными сборщиком мусора, если на них нет других ссылок за пределами WeakMap/WeakSet.

let map = new Map();
let obj = {};
map.set(obj, "value");
obj = null; // obj по-прежнему можно получить доступ к map

let weakMap = new WeakMap();
let weakObj = {};
weakMap.set(weakObj, "value");
weakObj = null; // obj можно собрать мусором, и значение в weakMap будет автоматически удалено