Почему нет прямого доступа к элементам в WeakMap? И когда сборщик мусора удаляет ссылку, которая является ключом к WeakMap, тогда также удаляется значение, связанное с этим ключом?
"Прямой доступ к элементам", я полагаю, вы имеете в виду, почему они не перечислимы? Здесь объяснение MDN:
Из-за слабости ссылок ключи WeakMap не перечислимы (т.е. Нет метода, предоставляющего вам список ключей). Если бы они были, список зависел бы от состояния сбора мусора, внедряя недетерминированность. Если вы хотите иметь список ключей, вы должны использовать
Map
.
Я не уверен, что понимаю вторую часть вопроса. Запись (например, пара ключ-значение) может быть удалена из WeakMap
если нет никаких слабых ссылок на ключ. То, что происходит со значением, будет таким же, как то, что произойдет, если оно будет удалено с Map
или из другого места: если это была последняя неслабая ссылка на это значение, она становится пригодной для сбора мусора. Однако до тех пор, пока запись (пара значений ключа) WeakMap
в WeakMap
, значение считается ссылкой и не будет собираться с мусором.
Функция WeakMap
предназначена для того, чтобы позволить элементам, добавленным к ней, автоматически собирать мусор, если сам WeakMap будет единственным оставшимся держателем этого элемента. Это полезно для хранения ссылки на какой-либо объект, в то время как существует другой объект (обычным вариантом использования является реализация свойств/доступа класса), а также обеспечивает безопасность, которая ранее не была доступна в JavaScript - вы можете получить доступ только к значению, если у вас есть ключ".
Из-за характера WeakMaps его свойства не могут быть напрямую переработаны - элемент доступен только при наличии ключа элемента. Если либо ключ больше не существует (старый объект), либо если ключ не доступен из этой части кода, у вас нет способа получить доступ к значению.
Если вам нужно получить доступ к значениям из других источников или перебрать все значения, вы должны использовать Map
. Тем не менее, Карта не позволит собирать или удалять ключи или значения; элементы должны быть удалены вручную для освобождения памяти.
Дополнительную информацию см. В документах MDN на WeakMaps. Сравните раздел описания с описанием карты.
get()
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…