Поиск…


Синтаксис

  • новый WeakMap ([итерируемый]);
  • weakmap.get (ключ);
  • weakmap.set (ключ, значение);
  • weakmap.has (ключ);
  • weakmap.delete (ключ);

замечания

Для использования WeakMap см. Что такое фактическое использование ES6 WeakMap? ,

Создание объекта WeakMap

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

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

const o1 = {a: 1, b: 2},
      o2 = {};

const weakmap = new WeakMap([[o1, true], [o2, o1]]);

Получение значения, связанного с ключом

Чтобы получить значение, связанное с ключом, используйте метод .get() . Если нет значения, связанного с ключом, он возвращает undefined .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.get(obj1)); // 7
console.log(weakmap.get(obj2)); // undefined

Присвоение значения ключу

Чтобы присвоить значение ключу, используйте метод .set() . Он возвращает объект WeakMap, поэтому вы можете связывать вызовы .set() .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap();
weakmap.set(obj1, 1).set(obj2, 2);
console.log(weakmap.get(obj1)); // 1
console.log(weakmap.get(obj2)); // 2

Проверка наличия элемента с ключом

Чтобы проверить, выходит ли элемент с указанным ключом в файл WeakMap, используйте .has() . Он возвращает true если он выходит, а в противном случае - false .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.has(obj1)); // true
console.log(weakmap.has(obj2)); // false

Удаление элемента с помощью ключа

Чтобы удалить элемент с указанным ключом, используйте метод .delete() . Он возвращает true если элемент существует и был удален, в противном случае - false .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.delete(obj1)); // true
console.log(weakmap.has(obj1)); // false
console.log(weakmap.delete(obj2)); // false

Слабая ссылочная демонстрация

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

Вот демонстрация слабой карты. Я использую очень большой объект в качестве значения, чтобы показать, что слабая ссылка не способствует подсчету ссылок.

// manually trigger garbage collection to make sure that we are in good status.
> global.gc(); 
undefined

// check initial memory use,heapUsed is 4M or so
> process.memoryUsage(); 
{ rss: 21106688,
  heapTotal: 7376896,
  heapUsed: 4153936,
  external: 9059 }

> let wm = new WeakMap();
undefined

> const b = new Object();
undefined

> global.gc();
undefined

// heapUsed is still 4M or so
> process.memoryUsage(); 
{ rss: 20537344,
  heapTotal: 9474048,
  heapUsed: 3967272,
  external: 8993 }

// add key-value tuple into WeakMap,
// key is b,value is 5*1024*1024 array 
> wm.set(b, new Array(5*1024*1024));
WeakMap {}

// manually garbage collection
> global.gc();
undefined

// heapUsed is still 45M
> process.memoryUsage(); 
{ rss: 62652416,
  heapTotal: 51437568,
  heapUsed: 45911664,
  external: 8951 }

// b reference to null
> b = null;
null

// garbage collection
> global.gc();
undefined

// after remove b reference to object,heapUsed is 4M again 
// it means the big array in WeakMap is released
// it also means weekmap does not contribute to big array's reference count, only b does.
> process.memoryUsage(); 
{ rss: 20639744,
  heapTotal: 8425472,
  heapUsed: 3979792,
  external: 8956 }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow