Когда бы вы использовали Map вместо WeakMap, когда у вас есть объекты в качестве ключей?

Несколько раз, когда я использовал объекты в качестве ключей на карте, я делал это для хранения метаданных об этом конкретном объекте. Я всегда использовал для этого WeakMap из-за того, что запись на карте собирает мусор автоматически, когда объект, который он использовал в качестве ключа, собирает мусор.

Хранение метаданных — это единственный вариант использования объектов в качестве ключей на картах, но мне любопытно, есть ли другие варианты использования объектов в качестве ключей, и если бы в этих случаях вы использовали обычный Map вместо WeakMap.


person m0meni    schedule 02.06.2016    source источник
comment
возможный дубликат В чем разница между картой ES6 и WeakMap? или Каково фактическое использование ES6 WeakMap?   -  person Bergi    schedule 02.06.2016
comment
@Bergi Я не думаю, что это дубликат, поскольку я знаю разницу между Map и WeakMap, и я указываю использование WeakMap в самом вопросе. Это больше о том, чтобы знать, когда вы будете использовать Map вместо WeakMap, что на самом деле не так много, как наоборот (использование WeakMap вместо Map).   -  person m0meni    schedule 02.06.2016
comment
Просто взгляните на ограничения WeakMaps. Например, они не являются итерируемыми, поэтому, если вам это нужно, вам понадобится Map.   -  person Bergi    schedule 02.06.2016
comment
@Bergi Думаю, мне просто любопытно, когда вы когда-нибудь сталкивались с таким сценарием. Я лучше понимаю вещи, когда могу связать их с чем-то, что я действительно сделал бы, но когда вам когда-нибудь понадобится перебирать метаданные?   -  person m0meni    schedule 02.06.2016
comment
В основном, когда вам нужна дополнительная поддержка браузера, возможность узнать размер, иметь возможность перебирать существующие ключи или иметь возможность иметь ключи-примитивы, такие как строка или числа, вы должны использовать карту. Вы также можете проверить, работает ли он быстрее/медленнее карты.   -  person juvian    schedule 02.06.2016
comment
Рассмотрим реализацию для моделирования графов. Предположим, что узлы графа могут быть объектами, определяемыми пользователем. Реализация графа должна хранить эти узлы, но также связывать их с другими данными (такими как ребра (подумайте о словаре смежности)). Нам понадобится Map, поскольку мы также должны иметь возможность перебирать все узлы (это, например, то, что networkx.github.io делает (в Python) и мой порт JS).   -  person Felix Kling    schedule 02.06.2016
comment
@FelixKling, ах, отлично. Это именно то, что я хотел, спасибо!   -  person m0meni    schedule 02.06.2016
comment
И даже если бы нам не нужно было перебирать узлы, мы, вероятно, не хотели бы, чтобы они подвергались сборке мусора, если на них нет других ссылок, поскольку это молча уничтожило бы граф.   -  person Felix Kling    schedule 02.06.2016


Ответы (1)


Рассмотрим реализацию для моделирования графов. Предположим, что узлы графа могут быть объектами, определяемыми пользователем. Реализация графа должна хранить эти узлы, но также связывать их с другими данными (такими как ребра (подумайте о «словаре смежности»)). Нам понадобится карта, так как мы также должны иметь возможность перебирать все узлы (это, например, то, что делает networkx.github.io (в Python) и мой JS-порт)

И даже если бы нам не нужно было перебирать узлы, мы, вероятно, не хотели бы, чтобы они подвергались сборке мусора, если на них нет других ссылок, поскольку это молча уничтожило бы граф.

- Феликс Клинг

person Community    schedule 20.06.2016