24 Keyed Collections
24.1 Map Objects
Map objects are collections of key/value pairs where both the keys and values may be arbitrary ECMAScript language values. A distinct key value may only occur in one key/value pair within the Map's collection. Distinct key values are discriminated using the
Map object must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structures used in this Map objects specification is only intended to describe the required observable semantics of Map objects. It is not intended to be a viable implementation model.
24.1.1 The Map Constructor
The Map
- is
%Map% . - is the initial value of the
"Map" property of theglobal object . - creates and initializes a new Map object when called as a
constructor . - is not intended to be called as a function and will throw an exception when called in that manner.
- is designed to be subclassable. It may be used as the value in an
extendsclause of a class definition. Subclass constructors that intend to inherit the specified Map behaviour must include asupercall to the Mapconstructor to create and initialize the subclass instance with the internal state necessary to support theMap.prototypebuilt-in methods.
24.1.1.1 Map ( [ iterable ] )
When the Map function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let map be ?
OrdinaryCreateFromConstructor (NewTarget," , « [[MapData]] »).%Map.prototype% " Set map.[[MapData]] to a new emptyList .- If iterable is either
undefined ornull , return map. - Let adder be ?
Get (map,"set" ). - Return ?
AddEntriesFromIterable (map, iterable, adder).
If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element
24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )
The abstract operation AddEntriesFromIterable takes arguments target, iterable, and adder (a
- If
IsCallable (adder) isfalse , throw aTypeError exception. Assert : iterable is present, and is neitherundefined nornull .- Let iteratorRecord be ?
GetIterator (iterable). - Repeat,
- Let next be ?
IteratorStep (iteratorRecord). - If next is
false , return target. - Let nextItem be ?
IteratorValue (next). - If
Type (nextItem) is not Object, then- Let error be
ThrowCompletion (a newly createdTypeError object). - Return ?
IteratorClose (iteratorRecord, error).
- Let error be
- Let k be
Get (nextItem,"0" ). - If k is an
abrupt completion , return ?IteratorClose (iteratorRecord, k). - Let v be
Get (nextItem,"1" ). - If v is an
abrupt completion , return ?IteratorClose (iteratorRecord, v). - Let status be
Call (adder, target, « k.[[Value]], v.[[Value]] »). - If status is an
abrupt completion , return ?IteratorClose (iteratorRecord, status).
- Let next be ?
The parameter iterable is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element
24.1.2 Properties of the Map Constructor
The Map
- has a [[Prototype]] internal slot whose value is
%Function.prototype% . - has the following properties:
24.1.2.1 Map.prototype
The initial value of Map.prototype is the
This property has the attributes { [[Writable]]:
24.1.2.2 get Map [ @@species ]
Map[@@species] is an
- Return the
this value.
The value of the
Methods that create derived collection objects should call @@species to determine the
24.1.3 Properties of the Map Prototype Object
The Map prototype object:
- is
%Map.prototype% . - has a [[Prototype]] internal slot whose value is
%Object.prototype% . - is an
ordinary object . - does not have a [[MapData]] internal slot.
24.1.3.1 Map.prototype.clear ( )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } p of entries, do - Return
undefined .
24.1.3.2 Map.prototype.constructor
The initial value of Map.prototype.constructor is
24.1.3.3 Map.prototype.delete ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , then
- If p.[[Key]] is not
- Return
false .
The value
24.1.3.4 Map.prototype.entries ( )
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,key+value ).
24.1.3.5 Map.prototype.forEach ( callbackfn [ , thisArg ] )
When the forEach method is called with one or two arguments, the following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } e of entries, do- If e.[[Key]] is not
empty , then- Perform ?
Call (callbackfn, thisArg, « e.[[Value]], e.[[Key]], M »).
- Perform ?
- If e.[[Key]] is not
- Return
undefined .
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each key/value pair present in the map object, in key insertion order. callbackfn is called only for keys of the map which actually exist; it is not called for keys that have been deleted from the map.
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the item, the key of the item, and the Map object being traversed.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn. Each entry of a map's [[MapData]] is only visited once. New keys added after the call to forEach begins are visited. A key will be revisited if it is deleted after it has been visited and then re-added before the forEach call completes. Keys that are deleted after the call to forEach begins and before being visited are not visited unless the key is added again before the forEach call completes.
24.1.3.6 Map.prototype.get ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , return p.[[Value]].
- If p.[[Key]] is not
- Return
undefined .
24.1.3.7 Map.prototype.has ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , returntrue .
- If p.[[Key]] is not
- Return
false .
24.1.3.8 Map.prototype.keys ( )
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,key ).
24.1.3.9 Map.prototype.set ( key, value )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , thenSet p.[[Value]] to value.- Return M.
- If p.[[Key]] is not
- If key is
-0 𝔽, set key to+0 𝔽. - Let p be the
Record { [[Key]]: key, [[Value]]: value }. - Append p as the last element of entries.
- Return M.
24.1.3.10 get Map.prototype.size
Map.prototype.size is an
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[MapData]]). - Let entries be the
List that is M.[[MapData]]. - Let count be 0.
- For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty , set count to count + 1.
- If p.[[Key]] is not
- Return 𝔽(count).
24.1.3.11 Map.prototype.values ( )
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,value ).
24.1.3.12 Map.prototype [ @@iterator ] ( )
The initial value of the @@iterator property is the same
24.1.3.13 Map.prototype [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.1.4 Properties of Map Instances
Map instances are ordinary objects that inherit properties from the Map prototype. Map instances also have a [[MapData]] internal slot.
24.1.5 Map Iterator Objects
A Map Iterator is an object, that represents a specific iteration over some specific Map instance object. There is not a named
24.1.5.1 CreateMapIterator ( map, kind )
The abstract operation CreateMapIterator takes arguments map and kind. This operation is used to create iterator objects for Map methods that return such iterators. It performs the following steps when called:
Assert : kind iskey+value ,key , orvalue .- Perform ?
RequireInternalSlot (map, [[MapData]]). - Let closure be a new
Abstract Closure with no parameters that captures map and kind and performs the following steps when called:- Let entries be the
List that is map.[[MapData]]. - Let index be 0.
- Let numEntries be the number of elements of entries.
- Repeat, while index < numEntries,
- Let e be the
Record { [[Key]], [[Value]] } that is the value of entries[index]. Set index to index + 1.- If e.[[Key]] is not
empty , then- If kind is
key , let result be e.[[Key]]. - Else if kind is
value , let result be e.[[Value]]. - Else,
Assert : kind iskey+value .- Let result be !
CreateArrayFromList (« e.[[Key]], e.[[Value]] »).
- Perform ?
Yield (result). - NOTE: the number of elements in entries may have changed while execution of this abstract operation was paused by
Yield . Set numEntries to the number of elements of entries.
- If kind is
- Let e be the
- Return
undefined .
- Let entries be the
- Return !
CreateIteratorFromClosure (closure," ,%MapIteratorPrototype% "%MapIteratorPrototype% ).
24.1.5.2 The %MapIteratorPrototype% Object
The
- has properties that are inherited by all Map Iterator Objects.
- is an
ordinary object . - has a [[Prototype]] internal slot whose value is
%IteratorPrototype% . - has the following properties:
24.1.5.2.1 %MapIteratorPrototype% .next ( )
- Return ?
GeneratorResume (this value,empty ," ).%MapIteratorPrototype% "
24.1.5.2.2 %MapIteratorPrototype% [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.2 Set Objects
24.2.1 The Set Constructor
The
- is
%Set% . - is the initial value of the
"Set" property of theglobal object . - creates and initializes a new
Set object when called as aconstructor . - is not intended to be called as a function and will throw an exception when called in that manner.
- is designed to be subclassable. It may be used as the value in an
extendsclause of a class definition. Subclass constructors that intend to inherit the specifiedSet behaviour must include asupercall to theSet constructor to create and initialize the subclass instance with the internal state necessary to support theSet.prototypebuilt-in methods.
24.2.1.1 Set ( [ iterable ] )
When the Set function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let set be ?
OrdinaryCreateFromConstructor (NewTarget," , « [[SetData]] »).%Set.prototype% " Set set.[[SetData]] to a new emptyList .- If iterable is either
undefined ornull , return set. - Let adder be ?
Get (set,"add" ). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iteratorRecord be ?
GetIterator (iterable). - Repeat,
- Let next be ?
IteratorStep (iteratorRecord). - If next is
false , return set. - Let nextValue be ?
IteratorValue (next). - Let status be
Call (adder, set, « nextValue »). - If status is an
abrupt completion , return ?IteratorClose (iteratorRecord, status).
- Let next be ?
24.2.2 Properties of the Set Constructor
The
- has a [[Prototype]] internal slot whose value is
%Function.prototype% . - has the following properties:
24.2.2.1 Set.prototype
The initial value of Set.prototype is the
This property has the attributes { [[Writable]]:
24.2.2.2 get Set [ @@species ]
Set[@@species] is an
- Return the
this value.
The value of the
Methods that create derived collection objects should call @@species to determine the
24.2.3 Properties of the Set Prototype Object
The Set prototype object:
- is
%Set.prototype% . - has a [[Prototype]] internal slot whose value is
%Object.prototype% . - is an
ordinary object . - does not have a [[SetData]] internal slot.
24.2.3.1 Set.prototype.add ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - Let entries be the
List that is S.[[SetData]]. - For each element e of entries, do
- If e is not
empty andSameValueZero (e, value) istrue , then- Return S.
- If e is not
- If value is
-0 𝔽, set value to+0 𝔽. - Append value as the last element of entries.
- Return S.
24.2.3.2 Set.prototype.clear ( )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - Let entries be the
List that is S.[[SetData]]. - For each element e of entries, do
- Replace the element of entries whose value is e with an element whose value is
empty .
- Replace the element of entries whose value is e with an element whose value is
- Return
undefined .
24.2.3.3 Set.prototype.constructor
The initial value of Set.prototype.constructor is
24.2.3.4 Set.prototype.delete ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - Let entries be the
List that is S.[[SetData]]. - For each element e of entries, do
- If e is not
empty andSameValueZero (e, value) istrue , then- Replace the element of entries whose value is e with an element whose value is
empty . - Return
true .
- Replace the element of entries whose value is e with an element whose value is
- If e is not
- Return
false .
The value
24.2.3.5 Set.prototype.entries ( )
The following steps are taken:
- Let S be the
this value. - Return ?
CreateSetIterator (S,key+value ).
For iteration purposes, a
24.2.3.6 Set.prototype.forEach ( callbackfn [ , thisArg ] )
When the forEach method is called with one or two arguments, the following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - Let entries be the
List that is S.[[SetData]]. - For each element e of entries, do
- If e is not
empty , then- Perform ?
Call (callbackfn, thisArg, « e, e, S »).
- Perform ?
- If e is not
- Return
undefined .
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each value present in the set object, in value insertion order. callbackfn is called only for values of the
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the first two arguments are a value contained in the
The callbackfn is called with three arguments to be consistent with the call back functions used by forEach methods for Map and Array. For Sets, each item value is considered to be both the key and the value.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
Each value is normally visited only once. However, a value will be revisited if it is deleted after it has been visited and then re-added before the forEach call completes. Values that are deleted after the call to forEach begins and before being visited are not visited unless the value is added again before the forEach call completes. New values added after the call to forEach begins are visited.
24.2.3.7 Set.prototype.has ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - Let entries be the
List that is S.[[SetData]]. - For each element e of entries, do
- If e is not
empty andSameValueZero (e, value) istrue , returntrue .
- If e is not
- Return
false .
24.2.3.8 Set.prototype.keys ( )
The initial value of the
For iteration purposes, a
24.2.3.9 get Set.prototype.size
Set.prototype.size is an
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[SetData]]). - Let entries be the
List that is S.[[SetData]]. - Let count be 0.
- For each element e of entries, do
- If e is not
empty , set count to count + 1.
- If e is not
- Return 𝔽(count).
24.2.3.10 Set.prototype.values ( )
The following steps are taken:
- Let S be the
this value. - Return ?
CreateSetIterator (S,value ).
24.2.3.11 Set.prototype [ @@iterator ] ( )
The initial value of the @@iterator property is the same
24.2.3.12 Set.prototype [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.2.4 Properties of Set Instances
24.2.5 Set Iterator Objects
A
24.2.5.1 CreateSetIterator ( set, kind )
The abstract operation CreateSetIterator takes arguments set and kind. This operation is used to create iterator objects for
Assert : kind iskey+value orvalue .- Perform ?
RequireInternalSlot (set, [[SetData]]). - Let closure be a new
Abstract Closure with no parameters that captures set and kind and performs the following steps when called: - Return !
CreateIteratorFromClosure (closure," ,%SetIteratorPrototype% "%SetIteratorPrototype% ).
24.2.5.2 The %SetIteratorPrototype% Object
The
- has properties that are inherited by all
Set Iterator Objects. - is an
ordinary object . - has a [[Prototype]] internal slot whose value is
%IteratorPrototype% . - has the following properties:
24.2.5.2.1 %SetIteratorPrototype% .next ( )
- Return ?
GeneratorResume (this value,empty ," ).%SetIteratorPrototype% "
24.2.5.2.2 %SetIteratorPrototype% [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.3 WeakMap Objects
WeakMap objects are collections of key/value pairs where the keys are objects and values may be arbitrary ECMAScript language values. A WeakMap may be queried to see if it contains a key/value pair with a specific key, but no mechanism is provided for enumerating the objects it holds as keys. In certain conditions, objects which are not
An implementation may impose an arbitrarily determined latency between the time a key/value pair of a WeakMap becomes inaccessible and the time when the key/value pair is removed from the WeakMap. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to observe a key of a WeakMap that does not require the observer to present the observed key.
WeakMap objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of key/value pairs in the collection. The data structure used in this WeakMap objects specification are only intended to describe the required observable semantics of WeakMap objects. It is not intended to be a viable implementation model.
WeakMap and WeakSets are intended to provide mechanisms for dynamically associating state with an object in a manner that does not “leak” memory resources if, in the absence of the WeakMap or WeakSet, the object otherwise became inaccessible and subject to resource reclamation by the implementation's garbage collection mechanisms. This characteristic can be achieved by using an inverted per-object mapping of weak map instances to keys. Alternatively each weak map may internally store its key to value mappings but this approach requires coordination between the WeakMap or WeakSet implementation and the garbage collector. The following references describe mechanism that may be useful to implementations of WeakMap and WeakSets:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733.
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
24.3.1 The WeakMap Constructor
The WeakMap
- is
%WeakMap% . - is the initial value of the
"WeakMap" property of theglobal object . - creates and initializes a new WeakMap object when called as a
constructor . - is not intended to be called as a function and will throw an exception when called in that manner.
- is designed to be subclassable. It may be used as the value in an
extendsclause of a class definition. Subclass constructors that intend to inherit the specified WeakMap behaviour must include asupercall to the WeakMapconstructor to create and initialize the subclass instance with the internal state necessary to support theWeakMap.prototypebuilt-in methods.
24.3.1.1 WeakMap ( [ iterable ] )
When the WeakMap function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let map be ?
OrdinaryCreateFromConstructor (NewTarget," , « [[WeakMapData]] »).%WeakMap.prototype% " Set map.[[WeakMapData]] to a new emptyList .- If iterable is either
undefined ornull , return map. - Let adder be ?
Get (map,"set" ). - Return ?
AddEntriesFromIterable (map, iterable, adder).
If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element
24.3.2 Properties of the WeakMap Constructor
The WeakMap
- has a [[Prototype]] internal slot whose value is
%Function.prototype% . - has the following properties:
24.3.2.1 WeakMap.prototype
The initial value of WeakMap.prototype is the
This property has the attributes { [[Writable]]:
24.3.3 Properties of the WeakMap Prototype Object
The WeakMap prototype object:
- is
%WeakMap.prototype% . - has a [[Prototype]] internal slot whose value is
%Object.prototype% . - is an
ordinary object . - does not have a [[WeakMapData]] internal slot.
24.3.3.1 WeakMap.prototype.constructor
The initial value of WeakMap.prototype.constructor is
24.3.3.2 WeakMap.prototype.delete ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[WeakMapData]]). - Let entries be the
List that is M.[[WeakMapData]]. - If
Type (key) is not Object, returnfalse . - For each
Record { [[Key]], [[Value]] } p of entries, do - Return
false .
The value
24.3.3.3 WeakMap.prototype.get ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[WeakMapData]]). - Let entries be the
List that is M.[[WeakMapData]]. - If
Type (key) is not Object, returnundefined . - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , return p.[[Value]].
- If p.[[Key]] is not
- Return
undefined .
24.3.3.4 WeakMap.prototype.has ( key )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[WeakMapData]]). - Let entries be the
List that is M.[[WeakMapData]]. - If
Type (key) is not Object, returnfalse . - For each
Record { [[Key]], [[Value]] } p of entries, do- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , returntrue .
- If p.[[Key]] is not
- Return
false .
24.3.3.5 WeakMap.prototype.set ( key, value )
The following steps are taken:
- Let M be the
this value. - Perform ?
RequireInternalSlot (M, [[WeakMapData]]). - Let entries be the
List that is M.[[WeakMapData]]. - If
Type (key) is not Object, throw aTypeError exception. - For each
Record { [[Key]], [[Value]] } p of entries, do - Let p be the
Record { [[Key]]: key, [[Value]]: value }. - Append p as the last element of entries.
- Return M.
24.3.3.6 WeakMap.prototype [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.3.4 Properties of WeakMap Instances
WeakMap instances are ordinary objects that inherit properties from the WeakMap prototype. WeakMap instances also have a [[WeakMapData]] internal slot.
24.4 WeakSet Objects
WeakSet objects are collections of objects. A distinct object may only occur once as an element of a WeakSet's collection. A WeakSet may be queried to see if it contains a specific object, but no mechanism is provided for enumerating the objects it holds. In certain conditions, objects which are not
An implementation may impose an arbitrarily determined latency between the time an object contained in a WeakSet becomes inaccessible and the time when the object is removed from the WeakSet. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to determine if a WeakSet contains a particular object that does not require the observer to present the observed object.
WeakSet objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structure used in this WeakSet objects specification is only intended to describe the required observable semantics of WeakSet objects. It is not intended to be a viable implementation model.
See the NOTE in
24.4.1 The WeakSet Constructor
The WeakSet
- is
%WeakSet% . - is the initial value of the
"WeakSet" property of theglobal object . - creates and initializes a new WeakSet object when called as a
constructor . - is not intended to be called as a function and will throw an exception when called in that manner.
- is designed to be subclassable. It may be used as the value in an
extendsclause of a class definition. Subclass constructors that intend to inherit the specified WeakSet behaviour must include asupercall to the WeakSetconstructor to create and initialize the subclass instance with the internal state necessary to support theWeakSet.prototypebuilt-in methods.
24.4.1.1 WeakSet ( [ iterable ] )
When the WeakSet function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let set be ?
OrdinaryCreateFromConstructor (NewTarget," , « [[WeakSetData]] »).%WeakSet.prototype% " Set set.[[WeakSetData]] to a new emptyList .- If iterable is either
undefined ornull , return set. - Let adder be ?
Get (set,"add" ). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iteratorRecord be ?
GetIterator (iterable). - Repeat,
- Let next be ?
IteratorStep (iteratorRecord). - If next is
false , return set. - Let nextValue be ?
IteratorValue (next). - Let status be
Call (adder, set, « nextValue »). - If status is an
abrupt completion , return ?IteratorClose (iteratorRecord, status).
- Let next be ?
24.4.2 Properties of the WeakSet Constructor
The WeakSet
- has a [[Prototype]] internal slot whose value is
%Function.prototype% . - has the following properties:
24.4.2.1 WeakSet.prototype
The initial value of WeakSet.prototype is the
This property has the attributes { [[Writable]]:
24.4.3 Properties of the WeakSet Prototype Object
The WeakSet prototype object:
- is
%WeakSet.prototype% . - has a [[Prototype]] internal slot whose value is
%Object.prototype% . - is an
ordinary object . - does not have a [[WeakSetData]] internal slot.
24.4.3.1 WeakSet.prototype.add ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[WeakSetData]]). - If
Type (value) is not Object, throw aTypeError exception. - Let entries be the
List that is S.[[WeakSetData]]. - For each element e of entries, do
- If e is not
empty andSameValue (e, value) istrue , then- Return S.
- If e is not
- Append value as the last element of entries.
- Return S.
24.4.3.2 WeakSet.prototype.constructor
The initial value of WeakSet.prototype.constructor is the
24.4.3.3 WeakSet.prototype.delete ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[WeakSetData]]). - If
Type (value) is not Object, returnfalse . - Let entries be the
List that is S.[[WeakSetData]]. - For each element e of entries, do
- If e is not
empty andSameValue (e, value) istrue , then- Replace the element of entries whose value is e with an element whose value is
empty . - Return
true .
- Replace the element of entries whose value is e with an element whose value is
- If e is not
- Return
false .
The value
24.4.3.4 WeakSet.prototype.has ( value )
The following steps are taken:
- Let S be the
this value. - Perform ?
RequireInternalSlot (S, [[WeakSetData]]). - Let entries be the
List that is S.[[WeakSetData]]. - If
Type (value) is not Object, returnfalse . - For each element e of entries, do
- If e is not
empty andSameValue (e, value) istrue , returntrue .
- If e is not
- Return
false .
24.4.3.5 WeakSet.prototype [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value
This property has the attributes { [[Writable]]:
24.4.4 Properties of WeakSet Instances
WeakSet instances are ordinary objects that inherit properties from the WeakSet prototype. WeakSet instances also have a [[WeakSetData]] internal slot.