← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
24

Anahtarlı Koleksiyonlar (Keyed Collections)

24.1 Map Nesneleri (Map Objects)

Map'ler (Map), hem anahtarların hem de değerlerin keyfi ECMAScript dil değerleri (ECMAScript language values) olabildiği anahtar/değer çiftleri koleksiyonlarıdır. Benzersiz bir anahtar değeri, Map koleksiyonundaki yalnızca bir anahtar/değer çiftinde yer alabilir. Benzersiz anahtar değerleri, SameValueZero karşılaştırma algoritmasının semantikleri kullanılarak ayırt edilir.

Map'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 Map'lerin gerekli gözlemlenebilir semantiklerini tanımlamayı amaçlar. Kullanılabilir bir uygulama modeli olması amaçlanmamıştır.

24.1.1 Map Yapıcısı (The Map Constructor)

Map yapıcısı (constructor):

  • %Map% nesnesidir.

  • global nesnenin (global object) "Map" özelliğinin ilk değeridir.

  • bir yapıcı (constructor) olarak çağrıldığında yeni bir Map 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 Map 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 Map yapıcısına (constructor) bir super çağrısı içermelidir.

24.1.1.1 Map ( [ iterable ] )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. map, ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») olsun.

  3. map.[[MapData]] değerini yeni boş bir Liste (List) olarak ayarla.

  4. Eğer iterable, undefined veya null ise, map döndür.

  5. adder, ? Get(map, "set") olsun.

  6. Eğer IsCallable(adder) false ise, bir TypeError istisnası fırlat.

  7. ? AddEntriesFromIterable(map, iterable, adder) döndür.

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

AddEntriesFromIterable soyut işlemi, target (bir Nesne (Object)), iterable (bir ECMAScript dil değeri (ECMAScript language value) fakat undefined veya null değil) ve adder (bir fonksiyon nesnesi (function object)) argümanlarını alır ve bir Nesne (Object) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. adder, alıcı (receiver) olarak target ile çağrılacaktır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. iteratorRecord, ? GetIterator(iterable, sync) olsun.

  2. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, target döndür.

    3. Eğer next bir Nesne değilse (is not an Object), o zaman

      1. error, ThrowCompletion(yeni oluşturulmuş bir TypeError nesnesi) olsun.

      2. ? IteratorClose(iteratorRecord, error) döndür.

    4. key, Completion(Get(next, "0")) olsun.

    5. IfAbruptCloseIterator(key, iteratorRecord).

    6. value, Completion(Get(next, "1")) olsun.

    7. IfAbruptCloseIterator(value, iteratorRecord).

    8. status, Completion(Call(adder, target, « key, value »)) olsun.

    9. IfAbruptCloseIterator(status, iteratorRecord).

24.1.2 Map Yapıcısının Özellikleri (Properties of the Map Constructor)

Map yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

24.1.2.1 Map.groupBy ( items, callback )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. groups, ? GroupBy(items, callback, collection) olsun.

  2. map, ! Construct(%Map%) olsun.

  3. groups içindeki her { [[Key]], [[Elements]] } Kaydı (Record) olan group için sırayla şunu yap:

    1. elements, CreateArrayFromList(group.[[Elements]]) olsun.

    2. entry, { [[Key]]: group.[[Key]], [[Value]]: elements } Kaydı (Record) olsun.

    3. entry değerini map.[[MapData]] listesine ekle.

  4. map döndür.

24.1.2.2 Map.prototype

Map.prototype özelliğinin ilk değeri Map prototip nesnesidir (Map prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

24.1.2.3 get Map [ %Symbol.species% ]

Map[%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:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin ilk değeri "get [Symbol.species]" şeklindedir.

24.1.3 Map Prototip Nesnesinin Özellikleri (Properties of the Map Prototype Object)

Map prototip nesnesi:

24.1.3.1 Map.prototype.clear ( )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. entry.[[Key]] değerini empty olarak ayarla.

    2. entry.[[Value]] değerini empty olarak ayarla.

  4. undefined döndür.

24.1.3.2 Map.prototype.constructor

Map.prototype.constructor özelliğinin ilk değeri %Map% yapıcısıdır.

24.1.3.3 Map.prototype.delete ( key )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Key]] değerini empty olarak ayarla.

      2. entry.[[Value]] değerini empty olarak ayarla.

      3. true döndür.

  5. false döndür.

24.1.3.4 Map.prototype.entries ( )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map, this değeri olsun.

  2. ? CreateMapIterator(map, key+value) döndür.

24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. Eğer IsCallable(callback) false ise, bir TypeError istisnası fırlat.

  4. entries, map.[[MapData]] olsun.

  5. entriesCount, entries içindeki eleman sayısı olsun.

  6. index, 0 olsun.

  7. index < entriesCount olduğu sürece tekrarla,

    1. entry, entries[index] olsun.

    2. index değerini index + 1 olarak ayarla.

    3. Eğer entry.[[Key]] empty değilse, o zaman

      1. ? Call(callback, thisArg, « entry.[[Value]], entry.[[Key]], map ») işlemini gerçekleştir.

      2. NOTE: entries içindeki eleman sayısı callback yürütülmesi sırasında artmış olabilir.

      3. entriesCount değerini entries içindeki eleman sayısı olarak ayarla.

  8. undefined döndür.

24.1.3.6 Map.prototype.get ( key )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  5. 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:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  5. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  6. entry değerini map.[[MapData]] listesine ekle.

  7. 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:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. Eğer IsCallable(callback) false ise, bir TypeError istisnası fırlat.

  4. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  5. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  6. value, ? Call(callback, undefined, « key ») olsun.

  7. NOTE: Map nesnesi, callback yürütülmesi sırasında değiştirilmiş olabilir.

  8. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Value]] değerini value olarak ayarla.

      2. value döndür.

  9. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  10. entry değerini map.[[MapData]] listesine ekle.

  11. 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:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, true döndür.
  5. 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:

  1. map, this değeri olsun.

  2. ? 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:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. key değerini CanonicalizeKeyedCollectionKey(key) olarak ayarla.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Value]] değerini value olarak ayarla.

      2. map döndür.

  5. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  6. entry değerini map.[[MapData]] listesine ekle.

  7. 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:

  1. map, this değeri olsun.

  2. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  3. count, 0 olsun.

  4. map.[[MapData]] içindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse, count değerini count + 1 olarak ayarla.
  5. 𝔽(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:

  1. map, this değeri olsun.

  2. ? 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:

  1. ? RequireInternalSlot(map, [[MapData]]) işlemini gerçekleştir.

  2. 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:

    1. entries, map.[[MapData]] olsun.

    2. index, 0 olsun.

    3. entriesCount, entries içindeki eleman sayısı olsun.

    4. index < entriesCount olduğu sürece tekrarla,

      1. entry, entries[index] olsun.

      2. index değerini index + 1 olarak ayarla.

      3. 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.
    5. NormalCompletion(unused) döndür.

  3. 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 ( )
  1. ? 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ı

Alan Adı Değer Anlamı
[[SetObject]] bir Nesne (Object) Set veya benzeri nesne.
[[Size]] negatif olmayan bir tamsayı (integer) veya +∞ Nesnenin bildirilen boyutu.
[[Has]] bir fonksiyon nesnesi (function object) Nesnenin has metodu.
[[Keys]] bir fonksiyon nesnesi (function object) Nesnenin keys metodu.

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:

  1. Eğer obj bir Nesne değilse (is not an Object), bir TypeError istisnası fırlat.

  2. rawSize, ? Get(obj, "size") olsun.

  3. numberSize, ? ToNumber(rawSize) olsun.

  4. NOTE: Eğer rawSize undefined ise, numberSize değeri NaN olacaktır.

  5. Eğer numberSize NaN ise, bir TypeError istisnası fırlat.

  6. intSize, ! ToIntegerOrInfinity(numberSize) olsun.

  7. Eğer intSize < 0 ise, bir RangeError istisnası fırlat.

  8. has, ? Get(obj, "has") olsun.

  9. Eğer IsCallable(has) false ise, bir TypeError istisnası fırlat.

  10. keys, ? Get(obj, "keys") olsun.

  11. Eğer IsCallable(keys) false ise, bir TypeError istisnası fırlat.

  12. 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:

  1. Eğer SetDataIndex(setData, value) değeri not-found ise, false döndür.

  2. 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:

  1. value değerini CanonicalizeKeyedCollectionKey(value) olarak ayarla.

  2. size, setData içindeki eleman sayısı olsun.

  3. index, 0 olsun.

  4. index < size olduğu sürece tekrarla,

    1. element, setData[index] olsun.

    2. Eğer element empty değilse ve element değeri value ile aynıysa, o zaman

      1. index döndür.
    3. index değerini index + 1 olarak ayarla.

  5. 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:

  1. count, 0 olsun.

  2. setData içindeki her element elemanı için sırayla şunu yap:

    1. Eğer element empty değilse, count değerini count + 1 olarak ayarla.
  3. 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:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. set, ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») olsun.

  3. set.[[SetData]] değerini yeni boş bir Liste (List) olarak ayarla.

  4. Eğer iterable, undefined veya null ise, set döndür.

  5. adder, ? Get(set, "add") olsun.

  6. Eğer IsCallable(adder) false ise, bir TypeError istisnası fırlat.

  7. iteratorRecord, ? GetIterator(iterable, sync) olsun.

  8. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, set döndür.

    3. status, Completion(Call(adder, set, « next »)) olsun.

    4. IfAbruptCloseIterator(status, iteratorRecord).

24.2.3 Set Yapıcısının Özellikleri (Properties of the Set Constructor)

Set yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

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:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin ilk değeri "get [Symbol.species]" şeklindedir.

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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. value değerini CanonicalizeKeyedCollectionKey(value) olarak ayarla.

  4. set.[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, o zaman

      1. set döndür.
  5. value değerini set.[[SetData]] listesine ekle.

  6. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. set.[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. set.[[SetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.
  4. undefined döndür.

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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. value değerini CanonicalizeKeyedCollectionKey(value) olarak ayarla.

  4. set.[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, o zaman

      1. set.[[SetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.

      2. true döndür.

  5. false döndür.

24.2.4.5 Set.prototype.difference ( other )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. resultSetData, set.[[SetData]] listesinin bir kopyası olsun.

  5. Eğer SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] ise, o zaman

    1. thisSize, set.[[SetData]] listesindeki eleman sayısı olsun.

    2. index, 0 olsun.

    3. index < thisSize olduğu sürece tekrarla,

      1. entry, resultSetData[index] olsun.

      2. 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.
      3. index değerini index + 1 olarak ayarla.

  6. Değilse,

    1. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

    2. next, not-started olsun.

    3. next değeri done olmadığı sürece tekrarla,

      1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

      2. 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.
  7. result, OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») olsun.

  8. result.[[SetData]] değerini resultSetData olarak ayarla.

  9. 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:

  1. set, this değeri olsun.

  2. ? CreateSetIterator(set, key+value) döndür.

24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. Eğer IsCallable(callback) false ise, bir TypeError istisnası fırlat.

  4. entries, set.[[SetData]] olsun.

  5. entriesCount, entries içindeki eleman sayısı olsun.

  6. index, 0 olsun.

  7. index < entriesCount olduğu sürece tekrarla,

    1. entry, entries[index] olsun.

    2. index değerini index + 1 olarak ayarla.

    3. Eğer entry empty değilse, o zaman

      1. ? Call(callback, thisArg, « entry, entry, set ») işlemini gerçekleştir.

      2. NOTE: entries içindeki eleman sayısı callback yürütülmesi sırasında artmış olabilir.

      3. entriesCount değerini entries içindeki eleman sayısı olarak ayarla.

  8. undefined döndür.

24.2.4.8 Set.prototype.has ( value )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. value değerini CanonicalizeKeyedCollectionKey(value) olarak ayarla.

  4. set.[[SetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, true döndür.
  5. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. resultSetData, yeni boş bir Liste (List) olsun.

  5. Eğer SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] ise, o zaman

    1. thisSize, set.[[SetData]] listesindeki eleman sayısı olsun.

    2. index, 0 olsun.

    3. index < thisSize olduğu sürece tekrarla,

      1. entry, set.[[SetData]][index] olsun.

      2. index değerini index + 1 olarak ayarla.

      3. 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.
  6. Değilse,

    1. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

    2. next, not-started olsun.

    3. next değeri done olmadığı sürece tekrarla,

      1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

      2. 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.
  7. result, OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») olsun.

  8. result.[[SetData]] değerini resultSetData olarak ayarla.

  9. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. Eğer SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] ise, o zaman

    1. thisSize, set.[[SetData]] listesindeki eleman sayısı olsun.

    2. index, 0 olsun.

    3. index < thisSize olduğu sürece tekrarla,

      1. entry, set.[[SetData]][index] olsun.

      2. index değerini index + 1 olarak ayarla.

      3. 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.
  5. Değilse,

    1. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

    2. next, not-started olsun.

    3. next değeri done olmadığı sürece tekrarla,

      1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

      2. 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.
  6. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. Eğer SetDataSize(set.[[SetData]]) > otherRecord.[[Size]] ise, false döndür.

  5. thisSize, set.[[SetData]] listesindeki eleman sayısı olsun.

  6. index, 0 olsun.

  7. index < thisSize olduğu sürece tekrarla,

    1. entry, set.[[SetData]][index] olsun.

    2. index değerini index + 1 olarak ayarla.

    3. Eğer entry empty değilse, o zaman

      1. inOther, ToBoolean(? Call(otherRecord.[[Has]], otherRecord.[[SetObject]], « entry »)) olsun.

      2. Eğer inOther false ise, false döndür.

      3. NOTE: 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.

  8. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. Eğer SetDataSize(set.[[SetData]]) < otherRecord.[[Size]] ise, false döndür.

  5. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

  6. next, not-started olsun.

  7. next değeri done olmadığı sürece tekrarla,

    1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

    2. Eğer next done değilse, o zaman

      1. 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.
  8. 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.

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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. size, SetDataSize(set.[[SetData]]) olsun.

  4. 𝔽(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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

  5. resultSetData, set.[[SetData]] listesindeki elemanların bir kopyası olsun.

  6. next, not-started olsun.

  7. next değeri done olmadığı sürece tekrarla,

    1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

    2. Eğer next done değilse, o zaman

      1. next değerini CanonicalizeKeyedCollectionKey(next) olarak ayarla.

      2. resultIndex, SetDataIndex(resultSetData, next) olsun.

      3. Eğer resultIndex not-found ise, alreadyInResult değerini false olarak ayarla; aksi takdirde alreadyInResult değerini true olarak ayarla.

      4. Eğer SetDataHas(set.[[SetData]], next) true ise, o zaman

           1. Eğer *alreadyInResult* `true` ise, *resultSetData*[*resultIndex*] değerini `empty` olarak ayarla.
      5. Değilse,

           1. Eğer *alreadyInResult* `false` ise, *next* değerini *resultSetData* listesine ekle.
  8. result, OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») olsun.

  9. result.[[SetData]] değerini resultSetData olarak ayarla.

  10. 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:

  1. set, this değeri olsun.

  2. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  3. otherRecord, ? GetSetRecord(other) olsun.

  4. keysIterator, ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) olsun.

  5. resultSetData, set.[[SetData]] listesindeki elemanların bir kopyası olsun.

  6. next, not-started olsun.

  7. next değeri done olmadığı sürece tekrarla,

    1. next değerini ? IteratorStepValue(keysIterator) olarak ayarla.

    2. Eğer next done değilse, o zaman

      1. next değerini CanonicalizeKeyedCollectionKey(next) olarak ayarla.

      2. Eğer SetDataHas(resultSetData, next) false ise, o zaman

           1. *next* değerini *resultSetData* listesine ekle.
  8. result, OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») olsun.

  9. result.[[SetData]] değerini resultSetData olarak ayarla.

  10. 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:

  1. set, this değeri olsun.

  2. ? 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:

  1. ? RequireInternalSlot(set, [[SetData]]) işlemini gerçekleştir.

  2. 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:

    1. index, 0 olsun.

    2. entries, set.[[SetData]] olsun.

    3. entriesCount, entries içindeki eleman sayısı olsun.

    4. index < entriesCount olduğu sürece tekrarla,

      1. entry, entries[index] olsun.

      2. index değerini index + 1 olarak ayarla.

      3. 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.
    5. NormalCompletion(unused) döndür.

  3. 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 ( )
  1. ? 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.

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:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. map, ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») olsun.

  3. map.[[WeakMapData]] değerini yeni boş bir Liste (List) olarak ayarla.

  4. Eğer iterable, undefined veya null ise, map döndür.

  5. adder, ? Get(map, "set") olsun.

  6. Eğer IsCallable(adder) false ise, bir TypeError istisnası fırlat.

  7. ? AddEntriesFromIterable(map, iterable, adder) döndür.

24.3.2 WeakMap Yapıcısının Özellikleri (Properties of the WeakMap Constructor)

WeakMap yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

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:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, false döndür.

  4. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Key]] değerini empty olarak ayarla.

      2. entry.[[Value]] değerini empty olarak ayarla.

      3. true döndür.

  5. false döndür.

24.3.3.3 WeakMap.prototype.get ( key )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, undefined döndür.

  4. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  5. 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:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, bir TypeError istisnası fırlat.

  4. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  5. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  6. entry değerini weakMap.[[WeakMapData]] listesine ekle.

  7. 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:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, bir TypeError istisnası fırlat.

  4. Eğer IsCallable(callback) false ise, bir TypeError istisnası fırlat.

  5. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, entry.[[Value]] döndür.
  6. value, ? Call(callback, undefined, « key ») olsun.

  7. NOTE: WeakMap nesnesi, callback yürütülmesi sırasında değiştirilmiş olabilir.

  8. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Value]] değerini value olarak ayarla.

      2. value döndür.

  9. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  10. entry değerini weakMap.[[WeakMapData]] listesine ekle.

  11. 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:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, false döndür.

  4. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, true döndür.
  5. 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:

  1. weakMap, this değeri olsun.

  2. ? RequireInternalSlot(weakMap, [[WeakMapData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(key) false ise, bir TypeError istisnası fırlat.

  4. weakMap.[[WeakMapData]] listesindeki her { [[Key]], [[Value]] } Kaydı (Record) olan entry için sırayla şunu yap:

    1. Eğer entry.[[Key]] empty değilse ve SameValue(entry.[[Key]], key) true ise, o zaman

      1. entry.[[Value]] değerini value olarak ayarla.

      2. weakMap döndür.

  5. entry, { [[Key]]: key, [[Value]]: value } Kaydı (Record) olsun.

  6. entry değerini weakMap.[[WeakMapData]] listesine ekle.

  7. 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.

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:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. set, ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») olsun.

  3. set.[[WeakSetData]] değerini yeni boş bir Liste (List) olarak ayarla.

  4. Eğer iterable, undefined veya null ise, set döndür.

  5. adder, ? Get(set, "add") olsun.

  6. Eğer IsCallable(adder) false ise, bir TypeError istisnası fırlat.

  7. iteratorRecord, ? GetIterator(iterable, sync) olsun.

  8. Tekrarla,

    1. next, ? IteratorStepValue(iteratorRecord) olsun.

    2. Eğer next done ise, set döndür.

    3. status, Completion(Call(adder, set, « next »)) olsun.

    4. IfAbruptCloseIterator(status, iteratorRecord).

24.4.2 WeakSet Yapıcısının Özellikleri (Properties of the WeakSet Constructor)

WeakSet yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

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:

  1. weakSet, this değeri olsun.

  2. ? RequireInternalSlot(weakSet, [[WeakSetData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(value) false ise, bir TypeError istisnası fırlat.

  4. weakSet.[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, o zaman

      1. weakSet döndür.
  5. value değerini weakSet.[[WeakSetData]] listesine ekle.

  6. 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:

  1. weakSet, this değeri olsun.

  2. ? RequireInternalSlot(weakSet, [[WeakSetData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(value) false ise, false döndür.

  4. weakSet.[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, o zaman

      1. weakSet.[[WeakSetData]] listesinin değeri entry olan elemanını, değeri empty olan bir elemanla değiştir.

      2. true döndür.

  5. false döndür.

24.4.3.4 WeakSet.prototype.has ( value )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. weakSet, this değeri olsun.

  2. ? RequireInternalSlot(weakSet, [[WeakSetData]]) işlemini gerçekleştir.

  3. Eğer CanBeHeldWeakly(value) false ise, false döndür.

  4. weakSet.[[WeakSetData]] listesindeki her entry elemanı için sırayla şunu yap:

    1. Eğer entry empty değilse ve SameValue(entry, value) true ise, true döndür.
  5. 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:

  1. Eğer key -0𝔽 ise, +0𝔽 döndür.

  2. key döndür.