Доступ к предметам WeakMap

1

Почему нет прямого доступа к элементам в WeakMap? И когда сборщик мусора удаляет ссылку, которая является ключом к WeakMap, тогда также удаляется значение, связанное с этим ключом?

Теги:

2 ответа

1

"Прямой доступ к элементам", я полагаю, вы имеете в виду, почему они не перечислимы? Здесь объяснение MDN:

Из-за слабости ссылок ключи WeakMap не перечислимы (т.е. Нет метода, предоставляющего вам список ключей). Если бы они были, список зависел бы от состояния сбора мусора, внедряя недетерминированность. Если вы хотите иметь список ключей, вы должны использовать Map.

Я не уверен, что понимаю вторую часть вопроса. Запись (например, пара ключ-значение) может быть удалена из WeakMap если нет никаких слабых ссылок на ключ. То, что происходит со значением, будет таким же, как то, что произойдет, если оно будет удалено с Map или из другого места: если это была последняя неслабая ссылка на это значение, она становится пригодной для сбора мусора. Однако до тех пор, пока запись (пара значений ключа) WeakMap в WeakMap, значение считается ссылкой и не будет собираться с мусором.

0

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

Из-за характера WeakMaps его свойства не могут быть напрямую переработаны - элемент доступен только при наличии ключа элемента. Если либо ключ больше не существует (старый объект), либо если ключ не доступен из этой части кода, у вас нет способа получить доступ к значению.

Если вам нужно получить доступ к значениям из других источников или перебрать все значения, вы должны использовать Map. Тем не менее, Карта не позволит собирать или удалять ключи или значения; элементы должны быть удалены вручную для освобождения памяти.

Дополнительную информацию см. В документах MDN на WeakMaps. Сравните раздел описания с описанием карты.

  • 0
    Итак, если объект, на который указывает слабая ссылка, был удален, то мы теряем доступ к паре ключ-значение (ключ - это ссылка на удаленный объект), но эта пара остается в WeakMap? Или я до сих пор не понимаю этого?
  • 0
    Обычно, когда вы добавляете пару ключ-значение в WeakMap, ключ является объектом. Нет смысла использовать для этого скалярное значение. Однако, когда объект, который вы использовали в качестве ключа, становится недоступным из всех других частей вашего кода (он является сборщиком мусора или -collectible), тогда и ключ, и значение удаляются и GC-ed из WeakMap, следовательно, «Weak ». В этот момент вам, как правило, уже все равно, потому что у вас больше нет ключа, чтобы фактически получить значение из WeakMap.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню