Почему 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, ваш словарь ключей станет зависеть от состояния сборки мусора в приложении, что неизбежно приведет к невозможности отслеживания ошибок.