Почему ES6 WeakMap не может быть перечислимым?
До моего повторного входа в JavaScript (и связанного) я сделал много ActionScript 3, и там у них был объект Dictionary, у которого были слабые ключи, как и предстоящая WeakMap; но версия AS3 по-прежнему была перечислима как обычный общий объект, в то время как у WeakMap нет .keys()
или .values()
.
Версия AS3 позволила нам установить некоторые действительно интересные и полезные конструкции, но я чувствую, что версия JS несколько ограничена. Почему это?
Если Flash VM может это сделать, то что делает браузеры такими же? Я читал, как это было бы "недетерминированным", но это как-то правильно?
Ответы
Ответ 1
Наконец нашел реальный ответ: http://tc39wiki.calculist.org/es6/weak-map/
Ключевым свойством Weak Maps является невозможность перечислить их ключи. Это необходимо для предотвращения того, чтобы злоумышленники наблюдали за внутренним поведением других систем в среде, которые делят слабо отображаемые объекты. Если число или имена элементов в коллекции можно обнаружить из API, даже если значения не совпадают, экземпляры WeakMap могут создать боковой канал, в котором он ранее не был доступен.
Ответ 2
Это компромисс. Если вы вводите объектные словари ↔ , которые поддерживают перечислимость, у вас есть два варианта относительно сбора мусора:
-
Рассмотрим ключевую запись сильной ссылки, которая предотвращает сбор мусора объекта, который используется в качестве ключа.
-
Сделайте его слабым этапом, который позволяет его ключам собирать мусор, когда всякая другая ссылка ушла.
Если вы делаете # 1, вы будете очень легко стрелять в ногу, пропуская большие объекты в память повсюду. С другой стороны, если вы идете с опцией №2, ваш ключевой словарь будет зависеть от состояния сборки мусора в приложении, что неизбежно приведет к невозможности отследить ошибки.