Слабые Наборы (WeakSets) — это коллекции объектов. Отдельный объект может встречаться только один раз как элемент коллекции Слабого Набора (WeakSet). Можно запросить Слабый Набор (WeakSet), чтобы узнать, содержит ли он конкретный объект, но механизма для перечисления содержащихся в нем объектов не предусмотрено. В определенных условиях неактивные объекты удаляются как элементы Слабого Набора (WeakSet), как описано в разделе 9.10.3.
Реализация может накладывать произвольно определенную задержку между моментом, когда объект, содержащийся в Слабом Наборе (WeakSet), становится недоступным, и временем, когда объект удаляется из Слабого Набора (WeakSet). Если бы эта задержка наблюдалась для программы ECMAScript, она была бы источником неопределенности, которая могла бы повлиять на выполнение программы. По этой причине реализация ECMAScript не должна предоставлять никаких средств для определения того, содержит ли WeakSet конкретный объект, который не требует, чтобы наблюдатель представлял наблюдаемый объект.
WeakSets должен быть реализован с использованием либо хэш-таблиц, либо других механизмов, которые, в среднем, обеспечивают время доступа, которое сублинейно зависит от количества элементов в коллекции. Структура данных, используемая в этой спецификации, предназначена только для описания требуемой наблюдаемой семантики WeakSets. Он не предназначен для использования в качестве жизнеспособной модели реализации.
Слабая Карта (WeakMap) и Слабые Наборы (WeakSets) предназначены для предоставления механизмов динамического связывания состояния с объектом таким образом, чтобы не «расходовать» ресурсы памяти, при отсутствии объектов Слабой Карты (WeakMap) или Слабого Набора (WeakSet), в противном случае чтобы объект стал недоступен и подлежал восстановлению ресурсов со стороны реализации механизмов сборки мусора. Эта характеристика может быть достигнута путем использования инвертированного для каждого объекта сопоставления экземпляров слабой карты с ключами. В качестве альтернативы каждая слабая карта может внутренне хранить свой ключ к сопоставлениям значений, но этот подход требует координации между реализацией Слабой Карты (WeakMap) или Слабого Набора (WeakSet) и Сборщиком Мусора (garbage collector). Следующие ссылки описывают механизм, который может быть полезен для реализации Слабой Карты (WeakMap) и Слабого Набора (WeakSet):
Барри Хейс (Barry Hayes). 1997. Эфемероны: новый механизм завершения. В материалах 12-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям (OOPSLA ’97), А. Майкл Берман (ред.). ACM, Нью-Йорк, Нью-Йорк, США, 176-183, http://doi.acm.org/10.1145/263698.263733.
Александра Баррос (Alexandra Barros), Роберто Иерусалимши (Roberto Ierusalimschy), Устранение циклов в слабых таблицах. Журнал универсальных компьютерных наук — J.UCS, vol. 14, вып. 21, стр. 3481-3497, 2008 г., http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
24.4.1 Конструктор Слабого Набора (The WeakSet Constructor)
Конструктор Слабого Набора (WeakSet):
- является %WeakSet%.
- является начальное значение свойства «WeakSet» глобального объекта.
- создает и инициализирует новый Слабый Набор (WeakSe)t при вызове в качестве конструктора.
- не предназначен для вызова как функция и вызовет исключение при таком вызове.
- может использоваться как значение в предложении
extends
определения класса. Конструкторы подкласса, которые намереваются наследовать указанное поведение Слабого Набора (WeakSet), должны включать вызовsuper
для конструктора Слабого Набора (WeakSet) для создания и инициализации экземпляра подкласса с внутренним состоянием, необходимым для поддержки встроенных методовWeakSet.prototype
.
24.4.1.1 WeakSet ( [ iterable ] )
Когда функция WeakSet вызывается с необязательным аргументом iterable, выполняются следующие шаги:
1. Если NewTarget является undefined (не определен), выбросить исключение TypeError. 2. Пусть set будет ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", «[[WeakSetData]]»). 3. Установите set.[[WeakSetData]] в новый пустой Список. 4. Если iterable является undefined (не определен) или null, вернуть set. 5. Пусть adder будет ? Получить(set, "add"). 6. Если IsCallable(adder) имеет значение false, выбросить исключение TypeError. 7. Пусть iteratorRecord будет ? GetIterator(iterable). 8. Повторите, а. Пусть next будет ? IteratorStep(iteratorRecord). b. Если next является false (ложно), верните set. c. Пусть nextValue будет ? IteratorValue(next). d. Пусть status будет Call(adder, set, « nextValue »). e. IfAbruptCloseIterator(status, iteratorRecord).
24.4.2 Свойства конструктора Слабого Набора (Properties of the WeakSet Constructor)
Конструктор Слабого Набора (WeakSet):
- имеет внутренний слот [[Prototype]], значение которого является %Function.prototype%.
- обладает следующими свойствами:
24.4.2.1 WeakSet.prototype
Начальным значением WeakSet.prototype
является объект прототип Слабого Набора (WeakSet).
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.
24.4.3 Свойства объекта прототипа Слабого Набора (Properties of the WeakSet Prototype Object)
Объект прототипа WeakSet:
- является %WeakSet.prototype%.
- имеет внутренний слот [[Prototype]], значение которого равно %Object.prototype%.
- это обычный объект.
- не имеет внутреннего слота [[WeakSetData]].
24.4.3.1 WeakSet.prototype.add ( value )
Выполняются следующие шаги:
1. Пусть S будет значением this. 2. Выполнить ? RequireInternalSlot(S, [[WeakSetData]]). 3. Если Тип(value) не является Объектом, выбросить исключение TypeError. 4. Пусть записями entries будет Список из S.[[WeakSetData]]. 5. Для каждого элемента e из записей entries выполните а. Если e не empty и SameValue(e, value) является true (истинно), то i. Вернуть S. 6. Добавить value в качестве последнего элемента entries. 7. Верните S.
24.4.3.2 WeakSet.prototype.constructor
Начальным значением WeakSet.prototype.constructor
является внутренний объект %WeakSet%.
24.4.3.3 WeakSet.prototype.delete ( value )
Выполняются следующие шаги:
1. Пусть S будет значением this. 2. Выполнить ? RequireInternalSlot(S, [[WeakSetData]]). 3. Если Тип(value) не является Объектом, вернуть false. 4. Пусть записями entries будет Список из S.[[WeakSetData]]. 5. Для каждого элемента e из записей entries выполните а. Если e не empty и SameValue(e, value) является true (истинно), то i. Замените элемент записей entries, значение которых равно e, на элемент, значение которого empty. ii. Верните true. 6. Вернуть false.
Значение empty используется как устройство спецификации, чтобы указать, что запись была удалена. Фактические реализации могут выполнять другие действия, такие как физическое удаление записи из внутренних структур данных.
24.4.3.4 WeakSet.prototype.has ( value )
Выполняются следующие шаги:
1. Пусть S будет значением this. 2. Выполнить ? RequireInternalSlot(S, [[WeakSetData]]). 3. Пусть записями entries будет Список из S.[[WeakSetData]]. 4. Если Тип (значение) не является Объектом, вернуть false. 5. Для каждого элемента e из записей entries выполните а. Если e не empty и SameValue(e, value) является true (истинно), вернуть true. 6. Вернуть false.
24.4.3.5 WeakSet.prototype [ @@toStringTag ]
Начальным значением свойства @@toStringTag является строковое значение «WeakSet».
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}.
24.4.4 Свойства экземпляров Слабого Набора (Properties of WeakSet Instances)
Экземпляры Слабого Набора — это обычные объекты, наследующие свойства от прототипа WeakSet. Экземпляры WeakSet также имеют внутренний слот [[WeakSetData]].
Информационные ссылки
Стандарт ECMAScript — Раздел «24.4 WeakSet Objects» — https://tc39.es/ecma262/#sec-weakset-objects