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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам