№1. Решение проблемы отсутствия свойства .size
?
В JavaScript я никогда раньше не использовал ни WeakSet
, ни WeakMap
, и я не так много знаю о сборке мусора в целом (я разработчик PHP + JS, так что мне впервые действительно нужно подумать о вывозе мусора). Но я думаю, что у меня есть хороший вариант использования WeakMap
прямо сейчас. Так что я хотел бы, по крайней мере, начать экспериментировать с ним.
Главное, что я хочу подтвердить в своих экспериментах, это автоматическое удаление объектов после их сборки мусора. Это было бы легко проверить, если бы я мог просто получить доступ к свойству WeakSet.size
/WeakMap.size
в экземплярах, чтобы проверить их размер, но они не существуют в «слабых» версиях.
Если возможно, я предполагаю, что результаты могут отличаться, поскольку размер будет зависеть от того, запущен ли уже сборщик мусора. Но это нормально, так как ни один из этих экспериментальных кодов не будет использоваться в продакшене... Я просто хочу подтвердить, что действительно понимаю, как работает сборка мусора и WeakSet/WeakMap. Идея использования этой функции без возможности протестировать (и, следовательно, полностью понять) ее очень беспокоит меня, и я обеспокоен тем, что в конечном итоге узнаю об утечках памяти, когда будет слишком поздно (в производстве).
Существуют ли какие-либо обходные пути или альтернативы для решения проблемы отсутствия WeakSet.size
и WeakMap.size
... хотя бы для отладки/тестирования/обучения?
Если это не обходной путь .size
, есть ли способ проверить использование памяти моими экземплярами коллекции WeakMap
? Это было бы столь же полезно, как и главная забота.
Единственное, о чем я сейчас могу думать, это проверка памяти всего процесса Node.js... что мне кажется не очень надежным.
#2. Для чего нужен .length?
Также я немного смущен тем, почему существует свойство .length
в конструкторе класса/прототипе экземпляра как WeakSet
, так и WeakMap
(а не в ваших экземплярах).
В соответствии с:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
... на обеих страницах написано, что .length
это:
The value of the length property is 0.
Они буквально всегда жестко запрограммированы на число 0? Какой в этом смысл?
Поиск «WeakSet.length» или «WeakMap.length» в Google (включая двойные кавычки для точных результатов) не дает никакой дополнительной информации, только около 20 результатов для каждого, которые являются просто зеркалами страниц MDN.