Проще говоря, если переменная или объект «недоступны», то нет необходимости, чтобы переменная или объект продолжали храниться в памяти и должны быть переработаны.
Например:
let xiaoming = {name:'xiaoming'}//Создайте объект и используйте переменную xiaoming для ссылки xiaoming = null //Сделайте переменную xiaoming пустой, сделав объект {name:'xiaoming'} недоступным//{ name:'xiaoming'} Объект перерабатывается.
Если на объект ссылается массив и другие объекты, при условии, что массив и объект, ссылающийся на него, существуют в массиве, то объект считается доступным.
Объекты в массиве:
let xiaoming = {name:'xiaoming'} let arr = [Сяомин] xiaoming = null // Сделайте переменную xiaoming пустой // Объект {name:'xiaoming'} не будет освобожден, поскольку он существует в массиве.
Аналогично, если мы используем объект в качестве ключа Map
, если Map
существует
, то объект не будет переработан движком.
Ключевой объект на Map
:
let xiaoming = {name:'xiaoming'} пусть карта = новая карта() map.set(сяомин,'мальчик') xiaoming = null // Сделайте переменную xiaoming пустой // Объект {name:'xiaoming'} не будет освобожден, поскольку он является ключом карты.
WeapMap
принципиально отличается от Map
в обработке освобождения ключевых объектов. это просто, WeapMap
не будет препятствовать сборке мусора из-за объектов в качестве ключей.
Разницу между WeakMap
и Map
можно разделить на три аспекта:
WeakMap
может использовать объекты только в качестве ключейlet слабыйMap = new WeakMap() пусть obj = {name:'obj'} слабыйMap.set(obj,'obj как ключ') слабыйMap.set('str','str as the key')//Результаты выполнения кода ошибки
следующие:
Видно, что когда мы используем строки в качестве key
, программа не может нормально выполняться.
Другими словами, если у объекта нет других ссылок, кроме ссылки WeakMap
, то объект будет переработан системой.
Например:
пусть слабая карта = новая WeakMap() пусть obj = {name:'obj'} слабыйMap.set(obj,'obj как ключ') obj = null //Сделаем переменную obj пустой //В это время объект {name:'obj'} будет переработан
WeakMap
поддерживает ограниченные методыWeakMap
не поддерживает итерациюWeakMap
не поддерживает keys()
WeakMap
не поддерживает values()
WeakMap
не поддерживает entires()
, поэтому у нас нет возможности получить все пары ключ-значение.
WeakMap
может использовать только следующие методы:
weakMap.get(key)
Получить пару ключ-значениеweakMap.set(key,val)
Установить пару ключ-значениеweakMap.delete(key)
Удалить пару ключ-значениеweakMap.has(key)
Определите,существует ли он. Метод доступа к данным WeakMap
должен быть ограничен, поскольку время освобождения объекта движком JavaScript
невозможно определить.
Когда объект теряет все ссылки, движок JavaScript
может освободить пространство, занимаемое объектом, немедленно или подождать некоторое время.
Поэтому в определенный момент количество элементов WeakMap
определить невозможно. (Представьте, что если мы пройдемся по элементам WeakMap
после того, как объект потеряет все ссылки, мы можем получить разные результаты.)
Сценарий применения WeakMap
обычно заключается в хранении данных, которые «принадлежат» объекту, когда объект не принадлежит. Если они присутствуют, данные, «принадлежащие» этому объекту, также должны быть освобождены.
Есть историческая история, которая очень подходит для использования WeakMap`: «Хитрый кролик умирает, холуи сварены, птицы пропали, а добрый лук спрятан».
Если мы описываем эту историю в коде JavaScript
, нам следует использовать WeakMap
:
let слабыйMap = new WeakMap(). let Rabbit = {name:'rabbit'} //Хитрый кролик let runDog = {name:'runDog'} //Бегущая собака let FlyBird = {name:'flyBird'} //Летящая птица letgoodBow = {name :'goodBow'} //Лян ГунweakMap.set(rabbit,runDog) слабыйMap.set(flyBird,goodBow) Rabbit = null //Хитрый кролик умирает flyBird = null //Птицы ушли //Скоро лакеи и добрый лук будут освобождены, может быть, не сразу //Эта история говорит нам, что нет хорошего конца для того, чтобы быть лакей, возможно, не сразу Убит //, но рано или поздно будет убит.По сравнению с Set,
Set
WeakSet
отличия:
WeakSet
может только добавлять элементы объектовWeakSet
не запрещает системе перерабатывать элементыWeakSet
add()
add()
, has()
, delete()
WeakSet
не поддерживает атрибут size
и keys()
.WeakMap
можем использовать WeakMap
для проверки некоторой информации о существовании или проверки статуса, например «да/нет». чтобы определить, находится ли пользователь в сети:
let onlineUser = new WeakMap() let zhangSan = {name:'Чжан Сан'} let liSi = {name:'李思'} let wangEr = {name:'王二'} let maZi = {name:'Mazi'} функция входа в систему (пользователь) { ... ... onlineUser.add(пользователь) } //Определяем, находится ли пользователь в сети function isOnline(user){ вернуть onlineUser.has(пользователь) }
Ограничением WeakMap
и WeakSet
является то, что они не могут перебирать и получать все элементы сразу, что не влияет на их важную роль в очень критических местах.
WeakMap
может использовать объекты только в качестве ключей. Когда все внешние ссылки на ключ потеряны (никакие другие переменные, кроме WeakMap
не ссылаются на ключевой объект), WeakMap
не препятствует движку повторно использовать значение ключа. После переработки соответствующие элементы WeakMap
больше не существуют.WeakSet
может хранить только объекты. Как только элемент объекта теряет все внешние ссылки (за исключением WeakSet
, никакие другие переменные не ссылаются на объект элемента), WeakSet
не будет препятствовать повторному использованию элемента движком. После переработки соответствующие элементы в WeakSet
исчезают.clear()
, size
, keys()
, values()
не поддерживаются. WeakMap
и WeakSet
часто используются для хранения структур данных, связанных с «основным» объектом. Как только «основной» объект теряет свое значение, соответствующий объект. связанная структура данных естественным образом удаляется.