callback , üç argüman kabul eden bir fonksiyon olmalıdır. forEach, Map'te bulunan her bir anahtar/değer çifti için anahtar ekleme sırasına göre callback fonksiyonunu bir kez çağırır. callback , yalnızca Map'te fiilen var olan anahtarlar için çağrılır; Map'ten silinmiş olan anahtarlar için çağrılmaz.
Eğer bir thisArg parametresi sağlanmışsa, her bir callback çağrısı için this değeri olarak kullanılacaktır. Sağlanmazsa, yerine undefined kullanılır.
callback üç argümanla çağrılır: elemanın değeri, elemanın anahtarı ve üzerinde gezinilen Map nesnesi.
forEach çağrıldığı nesneyi doğrudan değiştirmez (mutate) ancak nesne, callback çağrıları tarafından değiştirilebilir. Bir Map'in [[MapData]] listesindeki her bir girdi yalnızca bir kez ziyaret edilir. forEach çağrısı başladıktan sonra eklenen yeni anahtarlar ziyaret edilir. Bir anahtar ziyaret edildikten sonra silinir ve ardından forEach çağrısı tamamlanmadan önce tekrar eklenirse, yeniden ziyaret edilir. forEach çağrısı başladıktan sonra ve ziyaret edilmeden önce silinen anahtarlar, forEach çağrısı tamamlanmadan önce tekrar eklenmedikleri sürece ziyaret edilmezler.
# 24.1.3.6 Map.prototype.get ( key )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
key değerini CanonicalizeKeyedCollectionKey (key ) olarak ayarla.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
undefined döndür.
# 24.1.3.7 Map.prototype.getOrInsert ( key , value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
key değerini CanonicalizeKeyedCollectionKey (key ) olarak ayarla.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini map .[[MapData]] listesine ekle.
value döndür.
# 24.1.3.8 Map.prototype.getOrInsertComputed ( key , callback )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
Eğer IsCallable (callback ) false ise, bir TypeError istisnası fırlat.
key değerini CanonicalizeKeyedCollectionKey (key ) olarak ayarla.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
value , ? Call (callback , undefined, « key ») olsun.
NOTE : Map nesnesi, callback yürütülmesi sırasında değiştirilmiş olabilir.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, o zaman
entry .[[Value]] değerini value olarak ayarla.
value döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini map .[[MapData]] listesine ekle.
value döndür.
# 24.1.3.9 Map.prototype.has ( key )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
key değerini CanonicalizeKeyedCollectionKey (key ) olarak ayarla.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, true döndür.
false döndür.
# 24.1.3.10 Map.prototype.keys ( )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? CreateMapIterator (map , key) döndür.
# 24.1.3.11 Map.prototype.set ( key , value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
key değerini CanonicalizeKeyedCollectionKey (key ) olarak ayarla.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, o zaman
entry .[[Value]] değerini value olarak ayarla.
map döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini map .[[MapData]] listesine ekle.
map döndür.
# 24.1.3.12 get Map.prototype.size
Map.prototype.size, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property) . Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
count , 0 olsun.
map .[[MapData]] içindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse, count değerini count + 1 olarak ayarla.
𝔽 (count ) döndür.
# 24.1.3.13 Map.prototype.values ( )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
map , this değeri olsun.
? CreateMapIterator (map , value) döndür.
# 24.1.3.14 Map.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% özelliğinin ilk değeri, 24.1.3.4 içinde tanımlanan %Map.prototype.entries% değeridir.
# 24.1.3.15 Map.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "Map" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.1.4 Map Örneklerinin Özellikleri (Properties of Map Instances)
Map örnekleri, Map prototip nesnesinden (Map prototype object) özellikleri miras alan sıradan nesnelerdir (ordinary objects) . Map örnekleri ayrıca bir [[MapData]] dahili yuvasına sahiptir.
# 24.1.5 Map Yineleyici Nesneleri (Map Iterator Objects)
Bir Map Yineleyici (Map Iterator), belirli bir Map örnek nesnesi üzerinde belirli bir yinelemeyi (iteration) temsil eden bir nesnedir. Map Yineleyici nesneleri için adlandırılmış bir yapıcı (constructor) yoktur. Bunun yerine, Map Yineleyici nesneleri, Map örnek nesnelerinin belirli metotları çağrılarak oluşturulur.
# 24.1.5.1 CreateMapIterator ( map , kind )
CreateMapIterator soyut işlemi, map (bir ECMAScript dil değeri (ECMAScript language value) ) ve kind (key+value, key veya value) argümanlarını alır ve bir Generator içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bu yineleyicileri (iterators) döndüren Map metotları için yineleyici nesneler (iterator objects) oluşturmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:
? RequireInternalSlot (map , [[MapData]] ) işlemini gerçekleştir.
closure , map ve kind değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Soyut Kapatma (Abstract Closure) olsun:
entries , map .[[MapData]] olsun.
index , 0 olsun.
entriesCount , entries içindeki eleman sayısı olsun.
index < entriesCount olduğu sürece tekrarla,
entry , entries [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry .[[Key]] empty değilse, o zaman
1. Eğer *kind* `key` ise, o zaman
1. *result*, *entry*.*[[Key]]* olsun.
2. Değilse eğer *kind* `value` ise, o zaman
1. *result*, *entry*.*[[Value]]* olsun.
3. Değilse,
1. [Assert](06_sec-notational-conventions.md#assert): *kind*, `key+value` değeridir.
2. *result*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(« *entry*.*[[Key]]*, *entry*.*[[Value]]* ») olsun.
4. ? [GeneratorYield](28_sec-control-abstraction-objects.md#sec-generatoryield)([CreateIteratorResultObject](08_sec-abstract-operations.md#sec-createiterresultobject)(*result*, `false`)) işlemini gerçekleştir.
5. [NOTE](06_sec-notational-conventions.md#note-step): Bu soyut işlemin yürütülmesi [GeneratorYield](28_sec-control-abstraction-objects.md#sec-generatoryield) tarafından duraklatılmışken, *entries* listesindeki eleman sayısı artmış olabilir.
6. *entriesCount* değerini *entries* içindeki eleman sayısı olarak ayarla.
NormalCompletion (unused) döndür.
CreateIteratorFromClosure (closure , "%MapIteratorPrototype%", %MapIteratorPrototype% ) döndür.
# 24.1.5.2 %MapIteratorPrototype% Nesnesi (The %MapIteratorPrototype% Object)
%MapIteratorPrototype% nesnesi:
# 24.1.5.2.1 %MapIteratorPrototype%.next ( )
? GeneratorResume (this değeri, empty, "%MapIteratorPrototype%") döndür.
# 24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "Map Iterator" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.2 Set Nesneleri (Set Objects)
Set nesneleri, ECMAScript dil değerlerinin (ECMAScript language values) koleksiyonlarıdır. Bir Set, her benzersiz değeri en fazla bir kez içerebilir. Benzersiz değerler, SameValueZero karşılaştırma algoritmasının semantikleri kullanılarak ayırt edilir.
Set nesneleri, ortalamada koleksiyondaki eleman sayısına göre doğrusal altı (sublinear) erişim süreleri sağlayan karma tablolar (hash tables) veya diğer mekanizmalar kullanılarak uygulanmalıdır. Bu belirtimde kullanılan veri yapısı, yalnızca Set nesnelerinin gerekli gözlemlenebilir semantiklerini tanımlamayı amaçlar. Kullanılabilir bir uygulama modeli olması amaçlanmamıştır.
# 24.2.1 Set Nesneleri İçin Soyut İşlemler (Abstract Operations For Set Objects)
# 24.2.1.1 Set Kayıtları (Set Records)
Bir Set Kaydı (Set Record), bir Set veya benzeri bir nesnenin arayüzünü kapsüllemek için kullanılan bir Kayıt (Record) değeridir.
Set Kayıtları, Tablo 71 içinde listelenen alanlara sahiptir.
Tablo 71: Set Kaydı Alanları
# 24.2.1.2 GetSetRecord ( obj )
GetSetRecord soyut işlemi, obj (bir ECMAScript dil değeri (ECMAScript language value) ) argümanını alır ve bir Set Kaydı (Set Record) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer obj bir Nesne değilse (is not an Object) , bir TypeError istisnası fırlat.
rawSize , ? Get (obj , "size") olsun.
numberSize , ? ToNumber (rawSize ) olsun.
NOTE : Eğer rawSize undefined ise, numberSize değeri NaN olacaktır.
Eğer numberSize NaN ise, bir TypeError istisnası fırlat.
intSize , ! ToIntegerOrInfinity (numberSize ) olsun.
Eğer intSize < 0 ise, bir RangeError istisnası fırlat.
has , ? Get (obj , "has") olsun.
Eğer IsCallable (has ) false ise, bir TypeError istisnası fırlat.
keys , ? Get (obj , "keys") olsun.
Eğer IsCallable (keys ) false ise, bir TypeError istisnası fırlat.
Yeni bir Set Kaydı (Set Record) { [[SetObject]] : obj , [[Size]] : intSize , [[Has]] : has , [[Keys]] : keys } döndür.
# 24.2.1.3 SetDataHas ( setData , value )
SetDataHas soyut işlemi, setData (ya ECMAScript dil değerleri (ECMAScript language values) ya da empty içeren bir Liste (List) ) ve value (bir ECMAScript dil değeri (ECMAScript language value) ) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer SetDataIndex (setData , value ) değeri not-found ise, false döndür.
true döndür.
# 24.2.1.4 SetDataIndex ( setData , value )
SetDataIndex soyut işlemi, setData (ya ECMAScript dil değerleri (ECMAScript language values) ya da empty içeren bir Liste (List) ) ve value (bir ECMAScript dil değeri (ECMAScript language value) ) argümanlarını alır ve negatif olmayan bir tamsayı (integer) veya not-found döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
value değerini CanonicalizeKeyedCollectionKey (value ) olarak ayarla.
size , setData içindeki eleman sayısı olsun.
index , 0 olsun.
index < size olduğu sürece tekrarla,
element , setData [index ] olsun.
Eğer element empty değilse ve element değeri value ile aynıysa, o zaman
index döndür.
index değerini index + 1 olarak ayarla.
not-found döndür.
# 24.2.1.5 SetDataSize ( setData )
SetDataSize soyut işlemi, setData (ya ECMAScript dil değerleri (ECMAScript language values) ya da empty içeren bir Liste (List) ) argümanını alır ve negatif olmayan bir tamsayı (integer) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
count , 0 olsun.
setData içindeki her element elemanı için sırayla şunu yap:
Eğer element empty değilse, count değerini count + 1 olarak ayarla.
count döndür.
# 24.2.2 Set Yapıcısı (The Set Constructor)
Set yapıcısı (constructor) :
%Set% nesnesidir.
global nesnenin (global object) "Set" özelliğinin ilk değeridir.
bir yapıcı (constructor) olarak çağrıldığında yeni bir Set nesnesi (Set object) oluşturur ve başlatır.
fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.
bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen Set davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneğini oluşturmak ve başlatmak için Set yapıcısına (constructor) bir super çağrısı içermelidir.
# 24.2.2.1 Set ( [ iterable ] )
Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.
set , ? OrdinaryCreateFromConstructor (NewTarget, "%Set.prototype%", « [[SetData]] ») olsun.
set .[[SetData]] değerini yeni boş bir Liste (List) olarak ayarla.
Eğer iterable , undefined veya null ise, set döndür.
adder , ? Get (set , "add") olsun.
Eğer IsCallable (adder ) false ise, bir TypeError istisnası fırlat.
iteratorRecord , ? GetIterator (iterable , sync) olsun.
Tekrarla,
next , ? IteratorStepValue (iteratorRecord ) olsun.
Eğer next done ise, set döndür.
status , Completion (Call (adder , set , « next »)) olsun.
IfAbruptCloseIterator (status , iteratorRecord ).
# 24.2.3 Set Yapıcısının Özellikleri (Properties of the Set Constructor)
Set yapıcısı (constructor) :
# 24.2.3.1 Set.prototype
Set.prototype özelliğinin ilk değeri Set prototip nesnesidir (Set prototype object) .
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : false } özniteliklerine sahiptir.
# 24.2.3.2 get Set [ %Symbol.species% ]
Set[%Symbol.species%], set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property) . Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:
this değerini döndür.
Bu fonksiyonun "name" özelliğinin ilk değeri "get [Symbol.species]" şeklindedir.
NOT
Türetilmiş koleksiyon nesneleri oluşturan metotlar, türetilmiş nesneleri oluşturmak için kullanılacak yapıcıyı (constructor) belirlemek üzere %Symbol.species% özelliğini çağırmalıdır. Alt sınıf yapıcıları (constructors) , varsayılan yapıcı (constructor) atamasını değiştirmek için %Symbol.species% özelliğini geçersiz kılabilir (override).
# 24.2.4 Set Prototip Nesnesinin Özellikleri (Properties of the Set Prototype Object)
Set prototip nesnesi:
# 24.2.4.1 Set.prototype.add ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
value değerini CanonicalizeKeyedCollectionKey (value ) olarak ayarla.
set .[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, o zaman
set döndür.
value değerini set .[[SetData]] listesine ekle.
set döndür.
# 24.2.4.2 Set.prototype.clear ( )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
set .[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:
set .[[SetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.
undefined döndür.
NOT
Mevcut [[SetData]] Listesi (List) korunur çünkü o Liste (List) üzerinde yineleme yaparken yarıda askıya alınmış mevcut Set Yineleyici nesneleri (Set Iterator objects) olabilir.
# 24.2.4.3 Set.prototype.constructor
Set.prototype.constructor özelliğinin ilk değeri %Set% yapıcısıdır.
# 24.2.4.4 Set.prototype.delete ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
value değerini CanonicalizeKeyedCollectionKey (value ) olarak ayarla.
set .[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, o zaman
set .[[SetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.
true döndür.
false döndür.
NOT
empty değeri, bir girdinin silindiğini belirtmek için belirtim düzeyinde bir araç olarak kullanılır. Gerçek uygulamalar, girdiyi dahili veri yapılarından fiziksel olarak kaldırmak gibi diğer eylemleri gerçekleştirebilir.
# 24.2.4.5 Set.prototype.difference ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
resultSetData , set .[[SetData]] listesinin bir kopyası olsun.
Eğer SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] ise, o zaman
thisSize , set .[[SetData]] listesindeki eleman sayısı olsun.
index , 0 olsun.
index < thisSize olduğu sürece tekrarla,
entry , resultSetData [index ] olsun.
Eğer entry empty değilse, o zaman
1. *inOther*, [ToBoolean](08_sec-abstract-operations.md#sec-toboolean)(? [Call](08_sec-abstract-operations.md#sec-call)(*otherRecord*.*[[Has]]*, *otherRecord*.*[[SetObject]]*, « *entry* »)) olsun.
2. Eğer *inOther* `true` ise, o zaman
1. *resultSetData*[*index*] değerini `empty` olarak ayarla.
index değerini index + 1 olarak ayarla.
Değilse,
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
1. *next* değerini [CanonicalizeKeyedCollectionKey](#sec-canonicalizekeyedcollectionkey)(*next*) olarak ayarla.
2. *valueIndex*, [SetDataIndex](#sec-setdataindex)(*resultSetData*, *next*) olsun.
3. Eğer *valueIndex* `not-found` değilse, o zaman
1. *resultSetData*[*valueIndex*] değerini `empty` olarak ayarla.
result , OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») olsun.
result .[[SetData]] değerini resultSetData olarak ayarla.
result döndür.
# 24.2.4.6 Set.prototype.entries ( )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? CreateSetIterator (set , key+value) döndür.
NOT
Yineleme (iteration) amaçları doğrultusunda, bir Set, her girdinin anahtarı ve değeri için aynı değere sahip olduğu bir Map'e benzer görünür.
# 24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
Eğer IsCallable (callback ) false ise, bir TypeError istisnası fırlat.
entries , set .[[SetData]] olsun.
entriesCount , entries içindeki eleman sayısı olsun.
index , 0 olsun.
index < entriesCount olduğu sürece tekrarla,
entry , entries [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry empty değilse, o zaman
? Call (callback , thisArg , « entry , entry , set ») işlemini gerçekleştir.
NOTE : entries içindeki eleman sayısı callback yürütülmesi sırasında artmış olabilir.
entriesCount değerini entries içindeki eleman sayısı olarak ayarla.
undefined döndür.
NOT
callback , üç argüman kabul eden bir fonksiyon olmalıdır. forEach, Set içinde bulunan her bir değer için değer ekleme sırasına göre callback fonksiyonunu bir kez çağırır. callback , yalnızca Set'te fiilen var olan değerler için çağrılır; Set'ten silinmiş olan anahtarlar için çağrılmaz.
Eğer bir thisArg parametresi sağlanmışsa, her bir callback çağrısı için this değeri olarak kullanılacaktır. Sağlanmazsa, yerine undefined kullanılır.
callback üç argümanla çağrılır: ilk iki argüman Set içinde bulunan bir değerdir. Her iki argüman için de aynı değer aktarılır. Üzerinde gezinilen Set nesnesi (Set object) üçüncü argüman olarak aktarılır.
callback fonksiyonunun, Map ve Array için kullanılan forEach metotlarındaki geri çağırma fonksiyonlarıyla uyumlu olması için üç argümanla çağrılması sağlanmıştır. Set'ler için, her bir elemanın değeri hem anahtar hem de değer olarak kabul edilir.
forEach çağrıldığı nesneyi doğrudan değiştirmez (mutate) ancak nesne, callback çağrıları tarafından değiştirilebilir.
Her bir değer normalde yalnızca bir kez ziyaret edilir. Ancak, bir değer ziyaret edildikten sonra silinirse ve ardından forEach çağrısı tamamlanmadan önce tekrar eklenirse, yeniden ziyaret edilir. forEach çağrısı başladıktan sonra ve ziyaret edilmeden önce silinen değerler, forEach çağrısı tamamlanmadan önce değer tekrar eklenmediği sürece ziyaret edilmezler. forEach çağrısı başladıktan sonra eklenen yeni değerler ziyaret edilir.
# 24.2.4.8 Set.prototype.has ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
value değerini CanonicalizeKeyedCollectionKey (value ) olarak ayarla.
set .[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, true döndür.
false döndür.
# 24.2.4.9 Set.prototype.intersection ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
resultSetData , yeni boş bir Liste (List) olsun.
Eğer SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] ise, o zaman
thisSize , set .[[SetData]] listesindeki eleman sayısı olsun.
index , 0 olsun.
index < thisSize olduğu sürece tekrarla,
entry , set .[[SetData]] [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry empty değilse, o zaman
1. *inOther*, [ToBoolean](08_sec-abstract-operations.md#sec-toboolean)(? [Call](08_sec-abstract-operations.md#sec-call)(*otherRecord*.*[[Has]]*, *otherRecord*.*[[SetObject]]*, « *entry* »)) olsun.
2. Eğer *inOther* `true` ise, o zaman
1. [NOTE](06_sec-notational-conventions.md#note-step): *otherRecord*.*[[Has]]* işlevine yapılan önceki çağrıların *set*.*[[SetData]]* listesindeki bir elemanı kaldırması ve tekrar eklemesi mümkündür; bu durum aynı elemanın bu yineleme sırasında iki kez ziyaret edilmesine neden olabilir.
2. Eğer [SetDataHas](#sec-setdatahas)(*resultSetData*, *entry*) `false` ise, o zaman
1. *entry* değerini *resultSetData* listesine ekle.
3. [NOTE](06_sec-notational-conventions.md#note-step): *set*.*[[SetData]]* listesindeki eleman sayısı *otherRecord*.*[[Has]]* yürütülmesi sırasında artmış olabilir.
4. *thisSize* değerini *set*.*[[SetData]]* listesindeki eleman sayısı olarak ayarla.
Değilse,
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
1. *next* değerini [CanonicalizeKeyedCollectionKey](#sec-canonicalizekeyedcollectionkey)(*next*) olarak ayarla.
2. *inThis*, [SetDataHas](#sec-setdatahas)(*set*.*[[SetData]]*, *next*) olsun.
3. Eğer *inThis* `true` ise, o zaman
1. [NOTE](06_sec-notational-conventions.md#note-step): *other* nesnesi keyfi bir nesne olduğundan, `"keys"` [yineleyicisinin (iterator)](#sec-iterator-interface) aynı değeri birden fazla kez üretmesi mümkündür.
2. Eğer [SetDataHas](#sec-setdatahas)(*resultSetData*, *next*) `false` ise, o zaman
1. *next* değerini *resultSetData* listesine ekle.
result , OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») olsun.
result .[[SetData]] değerini resultSetData olarak ayarla.
result döndür.
# 24.2.4.10 Set.prototype.isDisjointFrom ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
Eğer SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] ise, o zaman
thisSize , set .[[SetData]] listesindeki eleman sayısı olsun.
index , 0 olsun.
index < thisSize olduğu sürece tekrarla,
entry , set .[[SetData]] [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry empty değilse, o zaman
1. *inOther*, [ToBoolean](08_sec-abstract-operations.md#sec-toboolean)(? [Call](08_sec-abstract-operations.md#sec-call)(*otherRecord*.*[[Has]]*, *otherRecord*.*[[SetObject]]*, « *entry* »)) olsun.
2. Eğer *inOther* `true` ise, `false` döndür.
3. [NOTE](06_sec-notational-conventions.md#note-step): *set*.*[[SetData]]* listesindeki eleman sayısı *otherRecord*.*[[Has]]* yürütülmesi sırasında artmış olabilir.
4. *thisSize* değerini *set*.*[[SetData]]* listesindeki eleman sayısı olarak ayarla.
Değilse,
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
1. Eğer [SetDataHas](#sec-setdatahas)(*set*.*[[SetData]]*, *next*) `true` ise, o zaman
1. ? [IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*keysIterator*, [NormalCompletion](07_sec-ecmascript-data-types-and-values.md#sec-normalcompletion)(`unused`)) işlemini gerçekleştir.
2. `false` döndür.
true döndür.
# 24.2.4.11 Set.prototype.isSubsetOf ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
Eğer SetDataSize (set .[[SetData]] ) > otherRecord .[[Size]] ise, false döndür.
thisSize , set .[[SetData]] listesindeki eleman sayısı olsun.
index , 0 olsun.
index < thisSize olduğu sürece tekrarla,
entry , set .[[SetData]] [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry empty değilse, o zaman
inOther , ToBoolean (? Call (otherRecord .[[Has]] , otherRecord .[[SetObject]] , « entry »)) olsun.
Eğer inOther false ise, false döndür.
NOTE : set .[[SetData]] listesindeki eleman sayısı otherRecord .[[Has]] yürütülmesi sırasında artmış olabilir.
thisSize değerini set .[[SetData]] listesindeki eleman sayısı olarak ayarla.
true döndür.
# 24.2.4.12 Set.prototype.isSupersetOf ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
Eğer SetDataSize (set .[[SetData]] ) < otherRecord .[[Size]] ise, false döndür.
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
Eğer SetDataHas (set .[[SetData]] , next ) false ise, o zaman
1. ? [IteratorClose](08_sec-abstract-operations.md#sec-iteratorclose)(*keysIterator*, [NormalCompletion](07_sec-ecmascript-data-types-and-values.md#sec-normalcompletion)(`unused`)) işlemini gerçekleştir.
2. `false` döndür.
true döndür.
# 24.2.4.13 Set.prototype.keys ( )
"keys" özelliğinin ilk değeri, 24.2.4.17 içinde tanımlanan %Set.prototype.values% değeridir.
NOT
Yineleme (iteration) amaçları doğrultusunda, bir Set, her girdinin anahtarı ve değeri için aynı değere sahip olduğu bir Map'e benzer görünür.
# 24.2.4.14 get Set.prototype.size
Set.prototype.size, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property) . Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
size , SetDataSize (set .[[SetData]] ) olsun.
𝔽 (size ) döndür.
# 24.2.4.15 Set.prototype.symmetricDifference ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
resultSetData , set .[[SetData]] listesindeki elemanların bir kopyası olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
next değerini CanonicalizeKeyedCollectionKey (next ) olarak ayarla.
resultIndex , SetDataIndex (resultSetData , next ) olsun.
Eğer resultIndex not-found ise, alreadyInResult değerini false olarak ayarla; aksi takdirde alreadyInResult değerini true olarak ayarla.
Eğer SetDataHas (set .[[SetData]] , next ) true ise, o zaman
1. Eğer *alreadyInResult* `true` ise, *resultSetData*[*resultIndex*] değerini `empty` olarak ayarla.
Değilse,
1. Eğer *alreadyInResult* `false` ise, *next* değerini *resultSetData* listesine ekle.
result , OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») olsun.
result .[[SetData]] değerini resultSetData olarak ayarla.
result döndür.
# 24.2.4.16 Set.prototype.union ( other )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
otherRecord , ? GetSetRecord (other ) olsun.
keysIterator , ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) olsun.
resultSetData , set .[[SetData]] listesindeki elemanların bir kopyası olsun.
next , not-started olsun.
next değeri done olmadığı sürece tekrarla,
next değerini ? IteratorStepValue (keysIterator ) olarak ayarla.
Eğer next done değilse, o zaman
next değerini CanonicalizeKeyedCollectionKey (next ) olarak ayarla.
Eğer SetDataHas (resultSetData , next ) false ise, o zaman
1. *next* değerini *resultSetData* listesine ekle.
result , OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») olsun.
result .[[SetData]] değerini resultSetData olarak ayarla.
result döndür.
# 24.2.4.17 Set.prototype.values ( )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
set , this değeri olsun.
? CreateSetIterator (set , value) döndür.
# 24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% özelliğinin ilk değeri, 24.2.4.17 içinde tanımlanan %Set.prototype.values% değeridir.
# 24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "Set" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.2.5 Set Örneklerinin Özellikleri (Properties of Set Instances)
Set örnekleri, Set prototip nesnesinden (Set prototype object) özellikleri miras alan sıradan nesnelerdir (ordinary objects) . Set örnekleri ayrıca bir [[SetData]] dahili yuvasına sahiptir.
# 24.2.6 Set Yineleyici Nesneleri (Set Iterator Objects)
Bir Set Yineleyici (Set Iterator), belirli bir Set örnek nesnesi üzerinde belirli bir yinelemeyi (iteration) temsil eden, yapısı aşağıda tanımlanan sıradan bir nesnedir (ordinary object) . Set Yineleyici nesneleri için adlandırılmış bir yapıcı (constructor) yoktur. Bunun yerine, Set Yineleyici nesneleri, Set örnek nesnelerinin belirli metotları çağrılarak oluşturulur.
# 24.2.6.1 CreateSetIterator ( set , kind )
CreateSetIterator soyut işlemi, set (bir ECMAScript dil değeri (ECMAScript language value) ) ve kind (key+value veya value) argümanlarını alır ve bir Generator içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bu yineleyicileri (iterators) döndüren Set metotları için yineleyici nesneler (iterator objects) oluşturmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:
? RequireInternalSlot (set , [[SetData]] ) işlemini gerçekleştir.
closure , set ve kind değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir Soyut Kapatma (Abstract Closure) olsun:
index , 0 olsun.
entries , set .[[SetData]] olsun.
entriesCount , entries içindeki eleman sayısı olsun.
index < entriesCount olduğu sürece tekrarla,
entry , entries [index ] olsun.
index değerini index + 1 olarak ayarla.
Eğer entry empty değilse, o zaman
1. Eğer *kind* `key+value` ise, o zaman
1. *result*, [CreateArrayFromList](08_sec-abstract-operations.md#sec-createarrayfromlist)(« *entry*, *entry* ») olsun.
2. ? [GeneratorYield](28_sec-control-abstraction-objects.md#sec-generatoryield)([CreateIteratorResultObject](08_sec-abstract-operations.md#sec-createiterresultobject)(*result*, `false`)) işlemini gerçekleştir.
2. Değilse,
1. [Assert](06_sec-notational-conventions.md#assert): *kind*, `value` değeridir.
2. ? [GeneratorYield](28_sec-control-abstraction-objects.md#sec-generatoryield)([CreateIteratorResultObject](08_sec-abstract-operations.md#sec-createiterresultobject)(*entry*, `false`)) işlemini gerçekleştir.
3. [NOTE](06_sec-notational-conventions.md#note-step): Bu soyut işlemin yürütülmesi [GeneratorYield](28_sec-control-abstraction-objects.md#sec-generatoryield) tarafından duraklatılmışken, *entries* listesindeki eleman sayısı artmış olabilir.
4. *entriesCount* değerini *entries* içindeki eleman sayısı olarak ayarla.
NormalCompletion (unused) döndür.
CreateIteratorFromClosure (closure , "%SetIteratorPrototype%", %SetIteratorPrototype% ) döndür.
# 24.2.6.2 %SetIteratorPrototype% Nesnesi (The %SetIteratorPrototype% Object)
%SetIteratorPrototype% nesnesi:
# 24.2.6.2.1 %SetIteratorPrototype%.next ( )
? GeneratorResume (this değeri, empty, "%SetIteratorPrototype%") döndür.
# 24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "Set Iterator" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.3 WeakMap Nesneleri (WeakMap Objects)
WeakMap'ler, anahtarların nesneler ve/veya semboller, değerlerin ise keyfi ECMAScript dil değerleri (ECMAScript language values) olabildiği anahtar/değer çiftleri koleksiyonlarıdır. Belirli bir anahtara sahip anahtar/değer çiftini içerip içermediğini görmek için bir WeakMap sorgulanabilir ancak anahtar olarak tuttuğu değerleri listelemek için herhangi bir mekanizma sağlanmaz. Bazı durumlarda, canlı (live) olmayan değerler, 9.9.3 içinde açıklandığı gibi WeakMap anahtarlarından kaldırılır.
Bir uygulama, bir WeakMap'in anahtar/değer çiftinin erişilemez hale gelmesi ile anahtar/değer çiftinin WeakMap'ten kaldırılması arasında keyfi olarak belirlenmiş bir gecikme (latency) uygulayabilir. Eğer bu gecikme bir ECMAScript programı tarafından gözlemlenebilseydi, program yürütülmesini etkileyebilecek bir belirsizlik kaynağı olurdu. Bu nedenle, bir ECMAScript uygulaması, gözlemcinin gözlemlenen anahtarı sunmasını gerektirmeyen, WeakMap'in bir anahtarını gözlemleme imkanı sağlamamalıdır.
WeakMap'ler, ortalamada koleksiyondaki anahtar/değer çiftlerinin sayısına göre doğrusal altı (sublinear) erişim süreleri sağlayan karma tablolar (hash tables) veya diğer mekanizmalar kullanılarak uygulanmalıdır. Bu belirtimde kullanılan veri yapısı, yalnızca WeakMap'lerin gerekli gözlemlenebilir semantiklerini tanımlamayı amaçlar. Kullanılabilir bir uygulama modeli olması amaçlanmamıştır.
NOT
WeakMap ve WeakSet ve benzerlerinin yokluğunda, nesnenin veya sembolün başka bir şekilde erişilemez hale gelmesi ve uygulamanın çöp toplama (garbage collection) mekanizmaları tarafından kaynak geri kazanımına tabi olması durumunda, bellek kaynaklarını "sızdırmayacak" şekilde bir nesne veya sembolle dinamik olarak durum ilişkilendirme mekanizmaları sağlamayı amaçlar. Bu özellik, WeakMap veya WeakSet örneklerinin anahtarlarla tersine çevrilmiş nesne/sembol başına (per-object/symbol) eşlemesi kullanılarak elde edilebilir. Alternatif olarak, her bir WeakMap veya WeakSet örneği kendi anahtar ve değer verilerini dahili olarak saklayabilir, ancak bu yaklaşım WeakMap veya WeakSet uygulaması ile çöp toplayıcı arasında koordinasyon gerektirir. Aşağıdaki referanslar, WeakMap ve WeakSet uygulamalarında faydalı olabilecek mekanizmaları açıklamaktadır:
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 WeakMap Yapıcısı (The WeakMap Constructor)
WeakMap yapıcısı (constructor) :
%WeakMap% nesnesidir.
global nesnenin (global object) "WeakMap" özelliğinin ilk değeridir.
bir yapıcı (constructor) olarak çağrıldığında yeni bir WeakMap oluşturur ve başlatır.
fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.
bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen WeakMap davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneğini oluşturmak ve başlatmak için WeakMap yapıcısına (constructor) bir super çağrısı içermelidir.
# 24.3.1.1 WeakMap ( [ iterable ] )
Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.
map , ? OrdinaryCreateFromConstructor (NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») olsun.
map .[[WeakMapData]] değerini yeni boş bir Liste (List) olarak ayarla.
Eğer iterable , undefined veya null ise, map döndür.
adder , ? Get (map , "set") olsun.
Eğer IsCallable (adder ) false ise, bir TypeError istisnası fırlat.
? AddEntriesFromIterable (map , iterable , adder ) döndür.
NOT
Eğer iterable parametresi mevcutsa, ilk elemanı WeakMap anahtarı olarak kullanılacak bir değer olan ve ikinci elemanı o anahtarla ilişkilendirilecek değer olan iki elemanlı dizi benzeri bir nesne (array-like object) üreten bir yineleyici nesne (iterator object) döndüren bir %Symbol.iterator% metodu uygulayan bir nesne olması beklenir.
# 24.3.2 WeakMap Yapıcısının Özellikleri (Properties of the WeakMap Constructor)
WeakMap yapıcısı (constructor) :
# 24.3.2.1 WeakMap.prototype
WeakMap.prototype özelliğinin ilk değeri WeakMap prototip nesnesidir (WeakMap prototype object) .
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : false } özniteliklerine sahiptir.
# 24.3.3 WeakMap Prototip Nesnesinin Özellikleri (Properties of the WeakMap Prototype Object)
WeakMap prototip nesnesi:
# 24.3.3.1 WeakMap.prototype.constructor
WeakMap.prototype.constructor özelliğinin ilk değeri %WeakMap% yapıcısıdır.
# 24.3.3.2 WeakMap.prototype.delete ( key )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, false döndür.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, o zaman
entry .[[Key]] değerini empty olarak ayarla.
entry .[[Value]] değerini empty olarak ayarla.
true döndür.
false döndür.
NOT
empty değeri, bir girdinin silindiğini belirtmek için belirtim düzeyinde bir araç olarak kullanılır. Gerçek uygulamalar, girdiyi dahili veri yapılarından fiziksel olarak kaldırmak gibi diğer eylemleri gerçekleştirebilir.
# 24.3.3.3 WeakMap.prototype.get ( key )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, undefined döndür.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
undefined döndür.
# 24.3.3.4 WeakMap.prototype.getOrInsert ( key , value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, bir TypeError istisnası fırlat.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini weakMap .[[WeakMapData]] listesine ekle.
value döndür.
# 24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key , callback )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, bir TypeError istisnası fırlat.
Eğer IsCallable (callback ) false ise, bir TypeError istisnası fırlat.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, entry .[[Value]] döndür.
value , ? Call (callback , undefined, « key ») olsun.
NOTE : WeakMap nesnesi, callback yürütülmesi sırasında değiştirilmiş olabilir.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, o zaman
entry .[[Value]] değerini value olarak ayarla.
value döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini weakMap .[[WeakMapData]] listesine ekle.
value döndür.
# 24.3.3.6 WeakMap.prototype.has ( key )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, false döndür.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, true döndür.
false döndür.
# 24.3.3.7 WeakMap.prototype.set ( key , value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakMap , this değeri olsun.
? RequireInternalSlot (weakMap , [[WeakMapData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (key ) false ise, bir TypeError istisnası fırlat.
weakMap .[[WeakMapData]] listesindeki her { [[Key]] , [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:
Eğer entry .[[Key]] empty değilse ve SameValue (entry .[[Key]] , key ) true ise, o zaman
entry .[[Value]] değerini value olarak ayarla.
weakMap döndür.
entry , { [[Key]] : key , [[Value]] : value } Kaydı (Record) olsun.
entry değerini weakMap .[[WeakMapData]] listesine ekle.
weakMap döndür.
# 24.3.3.8 WeakMap.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "WeakMap" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.3.4 WeakMap Örneklerinin Özellikleri (Properties of WeakMap Instances)
WeakMap örnekleri, WeakMap prototip nesnesinden (WeakMap prototype object) özellikleri miras alan sıradan nesnelerdir (ordinary objects) . WeakMap örnekleri ayrıca bir [[WeakMapData]] dahili yuvasına sahiptir.
# 24.4 WeakSet Nesneleri (WeakSet Objects)
WeakSet'ler, nesnelerin ve/veya sembollerin koleksiyonlarıdır. Benzersiz bir nesne veya sembol, bir WeakSet koleksiyonunun elemanı olarak yalnızca bir kez yer alabilir. Belirli bir değeri içerip içermediğini görmek için bir WeakSet sorgulanabilir ancak içerdiği değerleri listelemek için herhangi bir mekanizma sağlanmaz. Bazı durumlarda, canlı (live) olmayan değerler, 9.9.3 içinde açıklandığı gibi WeakSet elemanlarından kaldırılır.
Bir uygulama, bir WeakSet'te bulunan bir değerin erişilemez hale gelmesi ile değerin WeakSet'ten kaldırılması arasında keyfi olarak belirlenmiş bir gecikme (latency) uygulayabilir. Eğer bu gecikme bir ECMAScript programı tarafından gözlemlenebilseydi, program yürütülmesini etkileyebilecek bir belirsizlik kaynağı olurdu. Bu nedenle, bir ECMAScript uygulaması, gözlemcinin gözlemlenen değeri sunmasını gerektirmeyen, WeakSet'in belirli bir değeri içerip içermediğini belirleme imkanı sağlamamalıdır.
WeakSet'ler, ortalamada koleksiyondaki eleman sayısına göre doğrusal altı (sublinear) erişim süreleri sağlayan karma tablolar (hash tables) veya diğer mekanizmalar kullanılarak uygulanmalıdır. Bu belirtimde kullanılan veri yapısı, yalnızca WeakSet'lerin gerekli gözlemlenebilir semantiklerini tanımlamayı amaçlar. Kullanılabilir bir uygulama modeli olması amaçlanmamıştır.
NOT
24.3 içindeki NOT'a (NOTE) bakınız.
# 24.4.1 WeakSet Yapıcısı (The WeakSet Constructor)
WeakSet yapıcısı (constructor) :
%WeakSet% nesnesidir.
global nesnenin (global object) "WeakSet" özelliğinin ilk değeridir.
bir yapıcı (constructor) olarak çağrıldığında yeni bir WeakSet oluşturur ve başlatır.
fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.
bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen WeakSet davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneğini oluşturmak ve başlatmak için WeakSet yapıcısına (constructor) bir super çağrısı içermelidir.
# 24.4.1.1 WeakSet ( [ iterable ] )
Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.
set , ? OrdinaryCreateFromConstructor (NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») olsun.
set .[[WeakSetData]] değerini yeni boş bir Liste (List) olarak ayarla.
Eğer iterable , undefined veya null ise, set döndür.
adder , ? Get (set , "add") olsun.
Eğer IsCallable (adder ) false ise, bir TypeError istisnası fırlat.
iteratorRecord , ? GetIterator (iterable , sync) olsun.
Tekrarla,
next , ? IteratorStepValue (iteratorRecord ) olsun.
Eğer next done ise, set döndür.
status , Completion (Call (adder , set , « next »)) olsun.
IfAbruptCloseIterator (status , iteratorRecord ).
# 24.4.2 WeakSet Yapıcısının Özellikleri (Properties of the WeakSet Constructor)
WeakSet yapıcısı (constructor) :
# 24.4.2.1 WeakSet.prototype
WeakSet.prototype özelliğinin ilk değeri WeakSet prototip nesnesidir (WeakSet prototype object) .
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : false } özniteliklerine sahiptir.
# 24.4.3 WeakSet Prototip Nesnesinin Özellikleri (Properties of the WeakSet Prototype Object)
WeakSet prototip nesnesi:
# 24.4.3.1 WeakSet.prototype.add ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakSet , this değeri olsun.
? RequireInternalSlot (weakSet , [[WeakSetData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (value ) false ise, bir TypeError istisnası fırlat.
weakSet .[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, o zaman
weakSet döndür.
value değerini weakSet .[[WeakSetData]] listesine ekle.
weakSet döndür.
# 24.4.3.2 WeakSet.prototype.constructor
WeakSet.prototype.constructor özelliğinin ilk değeri %WeakSet% yapıcısıdır.
# 24.4.3.3 WeakSet.prototype.delete ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakSet , this değeri olsun.
? RequireInternalSlot (weakSet , [[WeakSetData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (value ) false ise, false döndür.
weakSet .[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, o zaman
weakSet .[[WeakSetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.
true döndür.
false döndür.
NOT
empty değeri, bir girdinin silindiğini belirtmek için belirtim düzeyinde bir araç olarak kullanılır. Gerçek uygulamalar, girdiyi dahili veri yapılarından fiziksel olarak kaldırmak gibi diğer eylemleri gerçekleştirebilir.
# 24.4.3.4 WeakSet.prototype.has ( value )
Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:
weakSet , this değeri olsun.
? RequireInternalSlot (weakSet , [[WeakSetData]] ) işlemini gerçekleştir.
Eğer CanBeHeldWeakly (value ) false ise, false döndür.
weakSet .[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:
Eğer entry empty değilse ve SameValue (entry , value ) true ise, true döndür.
false döndür.
# 24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% özelliğinin ilk değeri, "WeakSet" Dize (String) değeridir.
Bu özellik { [[Writable]] : false, [[Enumerable]] : false, [[Configurable]] : true } özniteliklerine sahiptir.
# 24.4.4 WeakSet Örneklerinin Özellikleri (Properties of WeakSet Instances)
WeakSet örnekleri, WeakSet prototip nesnesinden (WeakSet prototype object) özellikleri miras alan sıradan nesnelerdir (ordinary objects) . WeakSet örnekleri ayrıca bir [[WeakSetData]] dahili yuvasına sahiptir.
# 24.5 Anahtarlı Koleksiyonlar İçin Soyut İşlemler (Abstract Operations for Keyed Collections)
# 24.5.1 CanonicalizeKeyedCollectionKey ( key )
CanonicalizeKeyedCollectionKey soyut işlemi, key (bir ECMAScript dil değeri (ECMAScript language value) ) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer key -0𝔽 ise, +0𝔽 döndür.
key döndür.
← önceki 23 Dizinli Koleksiyonlar (Indexed Collections)
sonraki → 25 Yapılandırılmış Veri (Structured Data)