Подтвердить что ты не робот

Почему ES6 WeakMap не может быть перечислимым?

До моего повторного входа в JavaScript (и связанного) я сделал много ActionScript 3, и там у них был объект Dictionary, у которого были слабые ключи, как и предстоящая WeakMap; но версия AS3 по-прежнему была перечислима как обычный общий объект, в то время как у WeakMap нет .keys() или .values().

Версия AS3 позволила нам установить некоторые действительно интересные и полезные конструкции, но я чувствую, что версия JS несколько ограничена. Почему это?

Если Flash VM может это сделать, то что делает браузеры такими же? Я читал, как это было бы "недетерминированным", но это как-то правильно?

4b9b3361

Ответ 1

Наконец нашел реальный ответ: http://tc39wiki.calculist.org/es6/weak-map/

Ключевым свойством Weak Maps является невозможность перечислить их ключи. Это необходимо для предотвращения того, чтобы злоумышленники наблюдали за внутренним поведением других систем в среде, которые делят слабо отображаемые объекты. Если число или имена элементов в коллекции можно обнаружить из API, даже если значения не совпадают, экземпляры WeakMap могут создать боковой канал, в котором он ранее не был доступен.

Ответ 2

Это компромисс. Если вы вводите объектные словари ↔ , которые поддерживают перечислимость, у вас есть два варианта относительно сбора мусора:

  • Рассмотрим ключевую запись сильной ссылки, которая предотвращает сбор мусора объекта, который используется в качестве ключа.

  • Сделайте его слабым этапом, который позволяет его ключам собирать мусор, когда всякая другая ссылка ушла.

Если вы делаете # 1, вы будете очень легко стрелять в ногу, пропуская большие объекты в память повсюду. С другой стороны, если вы идете с опцией №2, ваш ключевой словарь будет зависеть от состояния сборки мусора в приложении, что неизбежно приведет к невозможности отследить ошибки.