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

ECMAScript Veri Türleri ve Değerleri

Bu belirtim içerisindeki algoritmalar, her biri ilişkili bir türe sahip olan değerleri işler. Olası değer türleri tam olarak bu maddede tanımlananlardır. Türler ayrıca ECMAScript dil türleri ve belirtim türleri olarak sınıflandırılır.

6.1 ECMAScript Dil Türleri

Bir ECMAScript dil türü, bir ECMAScript programcısı tarafından ECMAScript dili kullanılarak doğrudan işlenen değerlere karşılık gelir. ECMAScript dil türleri Undefined, Null, Boolean, String, Symbol, Number, BigInt ve Object'tir. Bir ECMAScript dil değeri, bir ECMAScript dil türü ile nitelenen bir değerdir.

6.1.1 Undefined Türü

Undefined türünün undefined olarak adlandırılan tam olarak bir değeri vardır. Bir değer atanmamış herhangi bir değişken undefined değerine sahiptir.

6.1.2 Null Türü

Null türünün null olarak adlandırılan tam olarak bir değeri vardır.

6.1.3 Boolean Türü

Boolean türü, true ve false olarak adlandırılan iki değere sahip bir mantıksal varlığı temsil eder.

6.1.4 String Türü

String türü, maksimum uzunluğu 253 - 1 öğe olmak üzere, sıfır veya daha fazla 16 bitlik işaretsiz tamsayı değerinin (“öğe”) tüm sıralı dizilerinin kümesidir. String türü genellikle çalışan bir ECMAScript programında metinsel veriyi temsil etmek için kullanılır; bu durumda String'teki her öğe bir UTF-16 kod birimi değeri olarak ele alınır. Her öğenin dizi içerisinde bir konum işgal ettiği kabul edilir. Bu konumlar, negatif olmayan tamsayılarla indislenir. İlk öğe (varsa) 0 indisinde, sonraki öğe (varsa) 1 indisinde bulunur ve böyle devam eder. Bir String'in uzunluğu, içerisindeki öğelerin (yani, 16 bitlik değerlerin) sayısıdır. Boş String'in uzunluğu sıfırdır ve bu nedenle hiçbir öğe içermez.

String içeriğini yorumlamayan ECMAScript işlemleri hiçbir ek anlambilim uygulamaz. String değerlerini yorumlayan işlemler, her öğeyi tek bir UTF-16 kod birimi olarak ele alır. Ancak ECMAScript, bu kod birimlerinin değerini veya aralarındaki ilişkileri kısıtlamaz; bu nedenle String içeriğini UTF-16'da kodlanmış Unicode kod noktaları dizileri olarak daha ileri düzeyde yorumlayan işlemler, iyi biçimlendirilmemiş alt dizileri hesaba katmak zorundadır. Bu tür işlemler, sayısal değeri 0xD800 ile 0xDBFF arasındaki dahil aralıkta olan her kod birimine (Unicode Standardı tarafından öncül vekil veya daha biçimsel olarak yüksek vekil kod birimi olarak tanımlanır) ve sayısal değeri 0xDC00 ile 0xDFFF arasındaki dahil aralıkta olan her kod birimine (artçıl vekil veya daha biçimsel olarak düşük vekil kod birimi olarak tanımlanır) aşağıdaki kuralları kullanarak özel işlem uygular:

  • Öncül vekil olmayan ve artçıl vekil olmayan bir kod birimi, aynı değere sahip bir kod noktası olarak yorumlanır.

  • İlk kod birimi c1'in bir öncül vekil ve ikinci kod birimi c2'nin bir artçıl vekil olduğu iki kod birimlik bir dizi, bir vekil çiftidir ve (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000 değerine sahip bir kod noktası olarak yorumlanır. (Bkz. 11.1.3)

  • Bir öncül vekil veya artçıl vekil olan ancak bir vekil çiftinin parçası olmayan bir kod birimi, aynı değere sahip bir kod noktası olarak yorumlanır.

String.prototype.normalize işlevi (bkz. 22.1.3.15), bir String değerini açıkça normalize etmek için kullanılabilir. String.prototype.localeCompare (bkz. 22.1.3.12) String değerlerini dahili olarak normalize eder, ancak başka hiçbir işlem üzerinde çalıştıkları dizgileri örtük olarak normalize etmez. İşlem sonuçları, aksi belirtilmedikçe dile ve/veya yerel ayarlara duyarlı değildir.

Bu belirtimde, “A, B, ...'nin dizgi birleştirmesi” ifadesi (burada her argüman bir String değeri, bir kod birimi veya bir kod birimi dizisidir), kod birimi dizisi, argümanların her birinin (sırasıyla) kod birimlerinin (sırasıyla) birleştirilmesi olan String değerini belirtir.

string'in inclusiveStart'tan exclusiveEnd'e kadar olan alt dizgisi” ifadesi (burada string bir String değeri veya bir kod birimi dizisi, inclusiveStart ve exclusiveEnd ise birer tamsayıdır), string'in inclusiveStart indisinde başlayan ve exclusiveEnd indisinden hemen önce biten ardışık kod birimlerinden oluşan String değerini belirtir (inclusiveStart = exclusiveEnd olduğunda bu, boş String olur). Eğer “to” eki atlanırsa, exclusiveEnd değeri olarak string'in uzunluğu kullanılır.

“ASCII sözcük karakterleri” ifadesi, yalnızca Unicode Temel Latin bloğundaki her harf ve rakamın yanı sıra U+005F (ALT ÇİZGİ) karakterinden oluşan şu String değerini belirtir: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_". Tarihsel nedenlerden ötürü, çeşitli algoritmalar için önem taşır.

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

StringIndexOf soyut işlemi, string (bir String), searchValue (bir String) ve fromIndex (negatif olmayan bir tamsayı) argümanlarını alır ve negatif olmayan bir tamsayı veya not-found döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. length, string'in uzunluğu olsun.

  2. Eğer searchValue boş String ise ve fromIndexlength ise, fromIndex'i döndür.

  3. searchLength, searchValue'nun uzunluğu olsun.

  4. fromIndexilength - searchLength olacak şekildeki her tamsayı i için, artan sırada,

    1. candidate, string'in i'den i + searchLength'e kadar olan alt dizgisi olsun.

    2. Eğer candidate, searchValue ise, i'yi döndür.

  5. not-found döndür.

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

StringLastIndexOf soyut işlemi, string (bir String), searchValue (bir String) ve fromIndex (negatif olmayan bir tamsayı) argümanlarını alır ve negatif olmayan bir tamsayı veya not-found döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. length, string'in uzunluğu olsun.

  2. searchLength, searchValue'nun uzunluğu olsun.

  3. Assert: fromIndex + searchLengthlength.

  4. 0 ≤ ifromIndex olacak şekildeki her tamsayı i için, azalan sırada,

    1. candidate, string'in i'den i + searchLength'e kadar olan alt dizgisi olsun.

    2. Eğer candidate, searchValue ise, i'yi döndür.

  5. not-found döndür.

6.1.5 Symbol Türü

Symbol türü, bir Object özelliğinin anahtarı olarak kullanılabilecek tüm String olmayan değerlerin kümesidir (6.1.7).

Her Symbol benzersiz ve değiştirilemezdir.

Her Symbol, değeri bir String veya undefined olan değiştirilemez bir [[Description]] iç yuvasına sahiptir.

6.1.5.1 İyi Bilinen Semboller

İyi bilinen semboller, bu belirtimin algoritmaları tarafından açıkça atıfta bulunulan yerleşik Symbol değerleridir. Tipik olarak, değerleri bir belirtim algoritmasının genişletme noktaları olarak hizmet eden özelliklerin anahtarları olarak kullanılırlar. Aksi belirtilmedikçe, iyi bilinen sembol değerleri tüm gerçeklik alanları tarafından paylaşılır (9.3).

Bu belirtim içerisinde, iyi bilinen bir sembole, içkinin Tablo 1'de listelenen değerlerden biri olduğu standart içkin gösterimi kullanılarak atıfta bulunulur.

Tablo 1: İyi Bilinen Semboller

Belirtim Adı [[Description]] Değer ve Amacı
%Symbol.asyncIterator% "Symbol.asyncIterator" Bir nesne için varsayılan async iterator'ü döndüren bir yöntem. for-await-of deyiminin anlambilimi tarafından çağrılır.
%Symbol.hasInstance% "Symbol.hasInstance" Bir oluşturucu nesnesinin, bir nesneyi oluşturucunun örneklerinden biri olarak tanıyıp tanımadığını belirleyen bir yöntem. instanceof işlecinin anlambilimi tarafından çağrılır.
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" Eğer true ise bir nesnenin Array.prototype.concat tarafından dizi öğelerine düzleştirilmesi gerektiğini belirten Boolean değerli bir özellik.
%Symbol.iterator% "Symbol.iterator" Bir nesne için varsayılan iterator'ü döndüren bir yöntem. for-of deyiminin anlambilimi tarafından çağrılır.
%Symbol.match% "Symbol.match" Düzenli ifadeyi bir dizgiyle eşleştiren bir düzenli ifade yöntemi. String.prototype.match yöntemi tarafından çağrılır.
%Symbol.matchAll% "Symbol.matchAll" Bir düzenli ifadenin bir dizgiyle eşleşmelerini veren bir iterator döndüren bir düzenli ifade yöntemi. String.prototype.matchAll yöntemi tarafından çağrılır.
%Symbol.replace% "Symbol.replace" Bir dizginin eşleşen alt dizgilerini değiştiren bir düzenli ifade yöntemi. String.prototype.replace yöntemi tarafından çağrılır.
%Symbol.search% "Symbol.search" Bir dizgi içerisinde düzenli ifadeyle eşleşen indisi döndüren bir düzenli ifade yöntemi. String.prototype.search yöntemi tarafından çağrılır.
%Symbol.species% "Symbol.species" Türetilmiş nesneler oluşturmak için kullanılan oluşturucu işlevi olan, işlev değerli bir özellik.
%Symbol.split% "Symbol.split" Bir dizgiyi, düzenli ifadeyle eşleşen indislerde bölen bir düzenli ifade yöntemi. String.prototype.split yöntemi tarafından çağrılır.
%Symbol.toPrimitive% "Symbol.toPrimitive" Bir nesneyi karşılık gelen ilkel bir değere dönüştüren bir yöntem. ToPrimitive soyut işlemi tarafından çağrılır.
%Symbol.toStringTag% "Symbol.toStringTag" Bir nesnenin varsayılan dizgi açıklamasının oluşturulmasında kullanılan, String değerli bir özellik. Yerleşik Object.prototype.toString yöntemi tarafından erişilir.
%Symbol.unscopables% "Symbol.unscopables" Kendi ve kalıtılan özellik adları, ilişkili nesnenin with ortam bağlamalarından hariç tutulan özellik adları olan, nesne değerli bir özellik.

6.1.6 Sayısal Türler

ECMAScript'in iki yerleşik sayısal türü vardır: Number ve BigInt. Aşağıdaki soyut işlemler bu sayısal türler üzerinde tanımlanmıştır. “Result” sütunu, işlemin bazı çağrılışlarının bir ani tamamlanma döndürmesinin mümkün olup olmadığının bir göstergesiyle birlikte dönüş türünü gösterir.

Tablo 2: Sayısal Tür İşlemleri

İşlem Örnek kaynak ... Evaluation anlambilimi tarafından çağrılır Sonuç
Number::unaryMinus -x Tek Terimli - İşleci Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x Bitsel DEĞİL İşleci ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y Üs Alma İşleci ve Math.pow ( taban, üs ) Number
BigInt::exponentiate ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması
Number::multiply x * y Çarpımsal İşleçler Number
BigInt::multiply BigInt
Number::divide x / y Çarpımsal İşleçler Number
BigInt::divide ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması
Number::remainder x % y Çarpımsal İşleçler Number
BigInt::remainder ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması
Number::add x ++ ++ x x + y Sonek Artırma İşleci, Önek Artırma İşleci ve Toplama İşleci ( + ) Number
BigInt::add BigInt
Number::subtract x -- -- x x - y Sonek Azaltma İşleci, Önek Azaltma İşleci ve Çıkarma İşleci ( - ) Number
BigInt::subtract BigInt
Number::leftShift x << y Sola Kaydırma İşleci ( << ) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y İşaretli Sağa Kaydırma İşleci ( >> ) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y İşaretsiz Sağa Kaydırma İşleci ( >>> ) Number
BigInt::unsignedRightShift bir fırlatma tamamlanması
Number::lessThan x < y x > y x <= y x >= y İlişkisel İşleçler, IsLessThan ( x, y, leftFirst ) aracılığıyla Boolean veya undefined (sırasız girdiler için)
BigInt::lessThan Boolean
Number::equal x == y x != y x === y x !== y Eşitlik İşleçleri, IsStrictlyEqual ( x, y ) aracılığıyla Boolean
BigInt::equal
Number::sameValue Object.is(x, y) Nesne iç yöntemleri, SameValue ( x, y ) aracılığıyla, tam değer eşitliğini sınamak için Boolean
Number::sameValueZero [x].includes(y) SameValueZero ( x, y ) aracılığıyla, Array, Map ve Set yöntemlerinde olduğu gibi +0𝔽 ile -0𝔽 arasındaki farkı yok sayarak değer eşitliğini sınamak için Boolean
Number::bitwiseAND x & y İkili Bitsel İşleçler Number
BigInt::bitwiseAND BigInt
Number::bitwiseXOR x ^ y Number
BigInt::bitwiseXOR BigInt
Number::bitwiseOR `x y` Number
BigInt::bitwiseOR BigInt
Number::toString String(x) Birçok ifade ve yerleşik işlev, ToString ( arg ) aracılığıyla String
BigInt::toString

Sayısal türler genel olarak duyarlık kaybı veya kesme olmaksızın dönüştürülemez olduğundan, ECMAScript dili bu türler arasında hiçbir örtük dönüşüm sağlamaz. Programcılar, başka bir tür gerektiren bir işlevi çağırırken türler arasında dönüşüm yapmak için Number ve BigInt işlevlerini açıkça çağırmalıdır.

6.1.6.1 Number Türü

Number türü, IEEE İkili Kayan Noktalı Aritmetik Standardında belirtilen çift duyarlıklı kayan noktalı IEEE 754-2019 binary64 değerlerini temsil eden tam olarak 18.437.736.874.454.810.627 (yani, 264 - 253 + 3) değere sahiptir; ancak IEEE Standardının 9.007.199.254.740.990 (yani, 253 - 2) farklı NaN değeri ECMAScript'te tek bir özel NaN değeri olarak temsil edilir. (NaN değerinin NaN program ifadesi tarafından üretildiğine dikkat edin.) Bazı gerçekleştirimlerde, harici kod çeşitli NaN değerleri arasındaki bir farkı tespit edebilir, ancak bu tür davranış gerçekleştirim tanımlıdır; ECMAScript kodu için tüm NaN değerleri birbirinden ayırt edilemez.

positive Infinity ve negative Infinity olarak adlandırılan iki diğer özel değer vardır. Kısalık adına, bu değerlere açıklayıcı amaçlarla sırasıyla +∞𝔽 ve -∞𝔽 sembolleri ile de atıfta bulunulur. (Bu iki sonsuz Number değerinin sırasıyla +Infinity (veya basitçe Infinity) ve -Infinity program ifadeleri tarafından üretildiğine dikkat edin.)

Diğer 18.437.736.874.454.810.624 (yani, 264 - 253) değer sonlu sayılar olarak adlandırılır. Bunların yarısı pozitif sayılar, yarısı da negatif sayılardır; her sonlu pozitif Number değeri için aynı büyüklüğe sahip karşılık gelen bir negatif değer vardır.

Hem bir positive zero hem de bir negative zero bulunduğuna dikkat edin. Kısalık adına, bu değerlere açıklayıcı amaçlarla sırasıyla +0𝔽 ve -0𝔽 sembolleri ile de atıfta bulunulur. (Bu iki farklı sıfır Number değerinin sırasıyla +0 (veya basitçe 0) ve -0 program ifadeleri tarafından üretildiğine dikkat edin.)

18.437.736.874.454.810.622 (yani, 264 - 253 - 2) sonlu sıfır olmayan değer iki çeşittir:

Bunların 18.428.729.675.200.069.632'si (yani, 264 - 254) normalleştirilmiş olup, şu biçime sahiptir:

s × m × 2e

burada s 1 veya -1, m, 252 (dahil) ile 253 (hariç) aralığında bir tamsayı ve e, -1074 ile 971 dahil aralığında bir tamsayıdır.

Geriye kalan 9.007.199.254.740.990 (yani, 253 - 2) değer normalleştirilmemiş olup, şu biçime sahiptir:

s × m × 2e

burada s 1 veya -1, m, 0 (hariç) ile 252 (hariç) aralığında bir tamsayı ve e = -1074'tür.

Büyüklüğü 253'ten büyük olmayan tüm pozitif ve negatif tamsayıların Number türünde temsil edilebilir olduğuna dikkat edin. 0 tamsayısının Number türünde iki temsili vardır: +0𝔽 ve -0𝔽.

Bir sonlu sayı, eğer sıfır değilse ve onu ifade etmek için kullanılan (yukarıda gösterilen iki biçimden birindeki) m tamsayısı tek ise tek anlamlıya sahiptir. Aksi takdirde, çift anlamlıya sahiptir.

Bu belirtimde, x'in tam bir gerçek matematiksel niceliği (π gibi irrasyonel bir sayı bile olabilir) temsil ettiği “x için Number value for” ifadesi, aşağıdaki biçimde seçilen bir Number değeri anlamına gelir. Number türünün tüm sonlu değerlerinin kümesini, -0𝔽 çıkarılmış ve Number türünde temsil edilemeyen iki ek değer, yani 21024 (ki +1 × 253 × 2971'dir) ve -21024 (ki -1 × 253 × 2971'dir) eklenmiş olarak düşünün. Bu kümenin, değerce x'e en yakın olan üyesini seçin. Kümenin iki değeri eşit derecede yakınsa, çift anlamlıya sahip olan seçilir; bu amaçla, 21024 ve -21024 ek değerlerinin çift anlamlıya sahip olduğu kabul edilir. Son olarak, eğer 21024 seçilmişse, onu +∞𝔽 ile değiştirin; eğer -21024 seçilmişse, onu -∞𝔽 ile değiştirin; eğer +0𝔽 seçilmişse, ancak ve ancak x < 0 ise onu -0𝔽 ile değiştirin; seçilen diğer herhangi bir değer değiştirilmeden kullanılır. Sonuç, x için Number value for olur. (Bu prosedür, IEEE 754-2019 roundTiesToEven kipinin davranışına tam olarak karşılık gelir.)

+∞ için Number value for +∞𝔽'dir ve -∞ için Number value for -∞𝔽'dir.

Bazı ECMAScript işleçleri, yalnızca -231 ile 231 - 1 dahil aralığı veya 0 ile 216 - 1 dahil aralığı gibi belirli aralıklardaki tamsayılarla ilgilenir. Bu işleçler Number türünün herhangi bir değerini kabul eder, ancak önce bu tür her değeri beklenen aralıktaki bir tamsayı değerine dönüştürür. 7.1'deki sayısal dönüşüm işlemlerinin açıklamalarına bakınız.

6.1.6.1.1 Number::unaryMinus ( number )

Soyut işlem Number::unaryMinus, number (bir Number) argümanını alır ve bir Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer number, NaN ise, NaN döndür.

  2. number'ın ters işaretlisini döndür; yani, aynı büyüklüğe ancak ters işarete sahip bir Number hesapla.

6.1.6.1.2 Number::bitwiseNOT ( number )

Soyut işlem Number::bitwiseNOT, number (bir Number) argümanını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. oldValue = ! ToInt32(number) olsun.

  2. oldValue'nun bitsel tümleyenini döndür. Sonucun matematiksel değeri tam olarak 32 bitlik ikiye tümleyen bir bit dizgisi olarak temsil edilebilir.

6.1.6.1.3 Number::exponentiate ( taban, üs )

Soyut işlem Number::exponentiate, taban (bir Number) ve üs (bir Number) argümanlarını alır ve bir Number döndürür. taban'ın üs kuvvetine yükseltilmesinin sonucunu temsil eden gerçekleştirim yaklaşık bir değer döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer üs, NaN ise, NaN döndür.

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

  3. Eğer taban, NaN ise, NaN döndür.

  4. Eğer taban, +∞𝔽 ise,

    1. Eğer üs > +0𝔽 ise, +∞𝔽 döndür.

    2. +0𝔽 döndür.

  5. Eğer taban, -∞𝔽 ise,

    1. Eğer üs > +0𝔽 ise,

      1. Eğer üs bir tek tam sayı Number ise, -∞𝔽 döndür.

      2. +∞𝔽 döndür.

    2. Eğer üs bir tek tam sayı Number ise, -0𝔽 döndür.

    3. +0𝔽 döndür.

  6. Eğer taban, +0𝔽 ise,

    1. Eğer üs > +0𝔽 ise, +0𝔽 döndür.

    2. +∞𝔽 döndür.

  7. Eğer taban, -0𝔽 ise,

    1. Eğer üs > +0𝔽 ise,

      1. Eğer üs bir tek tam sayı Number ise, -0𝔽 döndür.

      2. +0𝔽 döndür.

    2. Eğer üs bir tek tam sayı Number ise, -∞𝔽 döndür.

    3. +∞𝔽 döndür.

  8. Assert: taban sonludur ve ne +0𝔽 ne de -0𝔽'dir.

  9. Eğer üs, +∞𝔽 ise,

    1. Eğer abs((taban)) > 1 ise, +∞𝔽 döndür.

    2. Eğer abs((taban)) = 1 ise, NaN döndür.

    3. +0𝔽 döndür.

  10. Eğer üs, -∞𝔽 ise,

    1. Eğer abs((taban)) > 1 ise, +0𝔽 döndür.

    2. Eğer abs((taban)) = 1 ise, NaN döndür.

    3. +∞𝔽 döndür.

  11. Assert: üs sonludur ve ne +0𝔽 ne de -0𝔽'dir.

  12. Eğer taban < -0𝔽 ise ve üs bir tam sayı Number değilse, NaN döndür.

  13. (taban)'ın (üs) kuvvetine yükseltilmesinin sonucunu temsil eden gerçekleştirim yaklaşık bir Number değeri döndür.

6.1.6.1.4 Number::multiply ( x, y )

Soyut işlem Number::multiply, x (bir Number) ve y (bir Number) argümanlarını alır ve bir Number döndürür. IEEE 754-2019 ikili çift duyarlıklı aritmetik kurallarına göre çarpma işlemini gerçekleştirir, x ve y'nin çarpımını üretir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x, NaN veya y, NaN ise, NaN döndür.

  2. Eğer x, +∞𝔽 veya -∞𝔽 ise,

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

    2. Eğer y > +0𝔽 ise, x'i döndür.

    3. -x'i döndür.

  3. Eğer y, +∞𝔽 veya -∞𝔽 ise,

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

    2. Eğer x > +0𝔽 ise, y'yi döndür.

    3. -y'yi döndür.

  4. Eğer x, -0𝔽 ise,

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

    2. -0𝔽 döndür.

  5. Eğer y, -0𝔽 ise,

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

    2. -0𝔽 döndür.

  6. 𝔽((x) × (y)) döndür.

6.1.6.1.5 Number::divide ( x, y )

Soyut işlem Number::divide, x (bir Number) ve y (bir Number) argümanlarını alır ve bir Number döndürür. IEEE 754-2019 ikili çift duyarlıklı aritmetik kurallarına göre bölme işlemini gerçekleştirir; burada x bölünen ve y bölendir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x, NaN veya y, NaN ise, NaN döndür.

  2. Eğer x, +∞𝔽 veya -∞𝔽 ise,

    1. Eğer y, +∞𝔽 veya -∞𝔽 ise, NaN döndür.

    2. Eğer y, +0𝔽 veya y > +0𝔽 ise, x'i döndür.

    3. -x'i döndür.

  3. Eğer y, +∞𝔽 ise,

    1. Eğer x, +0𝔽 veya x > +0𝔽 ise, +0𝔽 döndür.

    2. -0𝔽 döndür.

  4. Eğer y, -∞𝔽 ise,

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

    2. +0𝔽 döndür.

  5. Eğer x, +0𝔽 veya -0𝔽 ise,

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

    2. Eğer y > +0𝔽 ise, x'i döndür.

    3. -x'i döndür.

  6. Eğer y, +0𝔽 ise,

    1. Eğer x > +0𝔽 ise, +∞𝔽 döndür.

    2. -∞𝔽 döndür.

  7. Eğer y, -0𝔽 ise,

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

    2. +∞𝔽 döndür.

  8. 𝔽((x) / (y)) döndür.

6.1.6.1.6 Number::remainder ( numerator, denominator )

Soyut işlem Number::remainder, numerator (bir Number) ve denominator (bir Number) argümanlarını alır ve bir Number döndürür. İşlenenlerinin örtük bir bölme işleminden kalanını verir; burada numerator bölünen ve denominator bölendir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer numerator, NaN veya denominator, NaN ise, NaN döndür.

  2. Eğer numerator, +∞𝔽 veya -∞𝔽 ise, NaN döndür.

  3. Eğer denominator, +∞𝔽 veya -∞𝔽 ise, numerator'ı döndür.

  4. Eğer denominator, +0𝔽 veya -0𝔽 ise, NaN döndür.

  5. Eğer numerator, +0𝔽 veya -0𝔽 ise, numerator'ı döndür.

  6. Assert: numerator ve denominator sonludur ve sıfır değildir.

  7. quotient, (numerator) / (denominator) olsun.

  8. truncatedQuotient, truncate(quotient) olsun.

  9. remainder, (numerator) - ((denominator) × truncatedQuotient) olsun.

  10. Eğer remainder = 0 ise ve numerator < -0𝔽 ise, -0𝔽 döndür.

  11. 𝔽(remainder) döndür.

6.1.6.1.7 Number::add ( x, y )

Soyut işlem Number::add, x (bir Number) ve y (bir Number) argümanlarını alır ve bir Number döndürür. IEEE 754-2019 ikili çift duyarlıklı aritmetik kurallarına göre toplama işlemini gerçekleştirir, argümanlarının toplamını üretir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x, NaN veya y, NaN ise, NaN döndür.

  2. Eğer x, +∞𝔽 ve y, -∞𝔽 ise, NaN döndür.

  3. Eğer x, -∞𝔽 ve y, +∞𝔽 ise, NaN döndür.

  4. Eğer x, +∞𝔽 veya -∞𝔽 ise, x'i döndür.

  5. Eğer y, +∞𝔽 veya -∞𝔽 ise, y'yi döndür.

  6. Assert: x ve y'nin her ikisi de sonludur.

  7. Eğer x, -0𝔽 ve y, -0𝔽 ise, -0𝔽 döndür.

  8. 𝔽((x) + (y)) döndür.

6.1.6.1.8 Number::subtract ( x, y )

Soyut işlem Number::subtract, x (bir Number) ve y (bir Number) argümanlarını alır ve bir Number döndürür. Çıkarma işlemini gerçekleştirir, işlenenlerinin farkını üretir; x eksilen ve y çıkandır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Number::add(x, Number::unaryMinus(y)) döndür.
6.1.6.1.9 Number::leftShift ( x, y )

Soyut işlem Number::leftShift, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. leftNumber = ! ToInt32(x) olsun.

  2. rightNumber = ! ToUint32(y) olsun.

  3. shiftCount = (rightNumber) modulo 32 olsun.

  4. leftNumber'ın shiftCount bit sola kaydırılmasının sonucunu döndür. Sonucun matematiksel değeri tam olarak 32 bitlik ikiye tümleyen bir bit dizgisi olarak temsil edilebilir.

6.1.6.1.10 Number::signedRightShift ( x, y )

Soyut işlem Number::signedRightShift, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. leftNumber = ! ToInt32(x) olsun.

  2. rightNumber = ! ToUint32(y) olsun.

  3. shiftCount = (rightNumber) modulo 32 olsun.

  4. leftNumber'ın shiftCount bit işaret genişletmeli sağa kaydırılmasının sonucunu döndür. En anlamlı bit yayılır. Sonucun matematiksel değeri tam olarak 32 bitlik ikiye tümleyen bir bit dizgisi olarak temsil edilebilir.

6.1.6.1.11 Number::unsignedRightShift ( x, y )

Soyut işlem Number::unsignedRightShift, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. leftNumber = ! ToUint32(x) olsun.

  2. rightNumber = ! ToUint32(y) olsun.

  3. shiftCount = (rightNumber) modulo 32 olsun.

  4. leftNumber'ın shiftCount bit sıfır doldurmalı sağa kaydırılmasının sonucunu döndür. Boşalan bitler sıfır ile doldurulur. Sonucun matematiksel değeri tam olarak 32 bitlik işaretsiz bir bit dizgisi olarak temsil edilebilir.

6.1.6.1.12 Number::lessThan ( x, y )

Soyut işlem Number::lessThan, x (bir Number) ve y (bir Number) argümanlarını alır ve bir Boolean veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x, NaN ise, undefined döndür.

  2. Eğer y, NaN ise, undefined döndür.

  3. Eğer x, y ise, false döndür.

  4. Eğer x, +0𝔽 ve y, -0𝔽 ise, false döndür.

  5. Eğer x, -0𝔽 ve y, +0𝔽 ise, false döndür.

  6. Eğer x, +∞𝔽 ise, false döndür.

  7. Eğer y, +∞𝔽 ise, true döndür.

  8. Eğer y, -∞𝔽 ise, false döndür.

  9. Eğer x, -∞𝔽 ise, true döndür.

  10. Assert: x ve y sonludur.

  11. Eğer (x) < (y) ise, true döndür.

  12. false döndür.

6.1.6.1.13 Number::equal ( x, y )

Soyut işlem Number::equal, x (bir Number) ve y (bir Number) 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 x, NaN ise, false döndür.

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

  3. Eğer x, y ise, true döndür.

  4. Eğer x, +0𝔽 ve y, -0𝔽 ise, true döndür.

  5. Eğer x, -0𝔽 ve y, +0𝔽 ise, true döndür.

  6. false döndür.

6.1.6.1.14 Number::sameValue ( x, y )

Soyut işlem Number::sameValue, x (bir Number) ve y (bir Number) 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 x, NaN ve y, NaN ise, true döndür.

  2. Eğer x, +0𝔽 ve y, -0𝔽 ise, false döndür.

  3. Eğer x, -0𝔽 ve y, +0𝔽 ise, false döndür.

  4. Eğer x, y ise, true döndür.

  5. false döndür.

6.1.6.1.15 Number::sameValueZero ( x, y )

Soyut işlem Number::sameValueZero, x (bir Number) ve y (bir Number) 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 x, NaN ve y, NaN ise, true döndür.

  2. Eğer x, +0𝔽 ve y, -0𝔽 ise, true döndür.

  3. Eğer x, -0𝔽 ve y, +0𝔽 ise, true döndür.

  4. Eğer x, y ise, true döndür.

  5. false döndür.

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

Soyut işlem NumberBitwiseOp, op (&, ^ veya |), x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. leftNumber = ! ToInt32(x) olsun.

  2. rightNumber = ! ToInt32(y) olsun.

  3. leftBits, (leftNumber)'ı temsil eden 32 bitlik ikiye tümleyen bit dizgisi olsun.

  4. rightBits, (rightNumber)'ı temsil eden 32 bitlik ikiye tümleyen bit dizgisi olsun.

  5. Eğer op, & ise,

    1. result, leftBits ve rightBits'e bitsel AND işlemi uygulanmasının sonucu olsun.
  6. Değilse, eğer op, ^ ise,

    1. result, leftBits ve rightBits'e bitsel özel VEYA (XOR) işlemi uygulanmasının sonucu olsun.
  7. Değilse,

    1. Assert: op, |'dir.

    2. result, leftBits ve rightBits'e bitsel içeren VEYA işlemi uygulanmasının sonucu olsun.

  8. 32 bitlik ikiye tümleyen result bit dizgisi tarafından temsil edilen tamsayı için Number value for değerini döndür.

6.1.6.1.17 Number::bitwiseAND ( x, y )

Soyut işlem Number::bitwiseAND, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NumberBitwiseOp(&, x, y) döndür.
6.1.6.1.18 Number::bitwiseXOR ( x, y )

Soyut işlem Number::bitwiseXOR, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NumberBitwiseOp(^, x, y) döndür.
6.1.6.1.19 Number::bitwiseOR ( x, y )

Soyut işlem Number::bitwiseOR, x (bir Number) ve y (bir Number) argümanlarını alır ve bir tam sayı Number döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NumberBitwiseOp(|, x, y) döndür.
6.1.6.1.20 Number::toString ( x, radix )

Soyut işlem Number::toString, x (bir Number) ve radix (2 ile 36 dahil aralığında bir tamsayı) argümanlarını alır ve bir String döndürür. x'i, radix tabanında bir konumsal sayı sistemi kullanarak bir String olarak temsil eder. r tabanını kullanan bir sayının gösteriminde kullanılan rakamlar, sırasıyla "0123456789abcdefghijklmnopqrstuvwxyz" dizgisinin ilk r kod biriminden alınır. Büyüklüğü 1𝔽'den büyük veya eşit olan sayıların gösterimi asla başta sıfır içermez. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x, NaN ise, "NaN" döndür.

  2. Eğer x, +0𝔽 veya -0𝔽 ise, "0" döndür.

  3. Eğer x < -0𝔽 ise, "-" ile Number::toString(-x, radix)'in dizgi birleştirmesini döndür.

  4. Eğer x, +∞𝔽 ise, "Infinity" döndür.

  5. n, k ve s, k ≥ 1, radixk - 1s < radixk, 𝔽(s × radixn - k) = x olacak ve k mümkün olduğunca küçük olacak şekilde tamsayılar olsun. k'nin, radix tabanında s'nin gösterimindeki basamak sayısı olduğuna, s'nin radix'e bölünemediğine ve s'nin en az anlamlı basamağının bu ölçütler tarafından mutlaka biricik biçimde belirlenmediğine dikkat edin.

  6. Eğer radix ≠ 10 ise veya n, -5 ile 21 dahil aralığında ise,

    1. Eğer nk ise,

      1. Aşağıdakilerin dizgi birleştirmesini döndür:

         - *radix* tabanında *s*'nin gösteriminin *k* basamağının kod birimleri
        
         - *n* - *k* tane 0x0030 (Rakam Sıfır) kod birimi
    2. Eğer n > 0 ise,

      1. Aşağıdakilerin dizgi birleştirmesini döndür:

         - *radix* tabanında *s*'nin gösteriminin en anlamlı *n* basamağının kod birimleri
        
         - 0x002E (Nokta) kod birimi
        
         - *radix* tabanında *s*'nin gösteriminin kalan *k* - *n* basamağının kod birimleri
    3. Assert: n ≤ 0.

    4. Aşağıdakilerin dizgi birleştirmesini döndür:

      • 0x0030 (Rakam Sıfır) kod birimi

      • 0x002E (Nokta) kod birimi

      • -n tane 0x0030 (Rakam Sıfır) kod birimi

      • radix tabanında s'nin gösteriminin k basamağının kod birimleri

  7. NOTE: Bu durumda, girdi, 1.2e+3 gibi bilimsel E gösterimi kullanılarak temsil edilecektir.

  8. Assert: radix 10'dur.

  9. Eğer n < 0 ise,

    1. exponentSign, 0x002D (Kısa Çizgi-Eksi) kod birimi olsun.
  10. Değilse,

    1. exponentSign, 0x002B (Artı İşareti) kod birimi olsun.
  11. Eğer k = 1 ise,

    1. Aşağıdakilerin dizgi birleştirmesini döndür:

      • s'nin tek basamağının kod birimi

      • 0x0065 (Küçük Latin Harfi E) kod birimi

      • exponentSign

      • abs(n - 1)'in ondalık gösteriminin kod birimleri

  12. Aşağıdakilerin dizgi birleştirmesini döndür:

    • s'nin ondalık gösteriminin en anlamlı basamağının kod birimi

    • 0x002E (Nokta) kod birimi

    • s'nin ondalık gösteriminin kalan k - 1 basamağının kod birimleri

    • 0x0065 (Küçük Latin Harfi E) kod birimi

    • exponentSign

    • abs(n - 1)'in ondalık gösteriminin kod birimleri

6.1.6.2 BigInt Türü

BigInt türü, bir tamsayı değerini temsil eder. Değer herhangi bir boyutta olabilir ve belirli bir bit genişliği ile sınırlı değildir. Genellikle, aksi belirtilmedikçe, işlemler tam matematiksel temelli yanıtlar döndürecek şekilde tasarlanmıştır. İkili işlemler için, BigInt'ler, negatif sayıların sonsuza kadar sola doğru bitlerinin 1 olduğu kabul edilerek, ikiye tümleyen ikili dizgiler olarak davranır.

6.1.6.2.1 BigInt::unaryMinus ( bigint )

Soyut işlem BigInt::unaryMinus, bigint (bir BigInt) argümanını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer bigint = 0 ise, 0 döndür.

  2. -bigint döndür.

6.1.6.2.2 BigInt::bitwiseNOT ( bigint )

Soyut işlem BigInt::bitwiseNOT, bigint (bir BigInt) argümanını alır ve bir BigInt döndürür. bigint'in birler tümleyenini döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. -bigint - 1 döndür.
6.1.6.2.3 BigInt::exponentiate ( taban, üs )

Soyut işlem BigInt::exponentiate, taban (bir BigInt) ve üs (bir BigInt) argümanlarını alır ve ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer üs < 0 ise, bir RangeError kuraldışı durumu fırlat.

  2. Eğer taban = 0 ve üs = 0 ise, 1 döndür.

  3. taban'ın üs kuvvetine yükseltilmiş halini döndür.

6.1.6.2.4 BigInt::multiply ( x, y )

Soyut işlem BigInt::multiply, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. x × y'yi döndür.
6.1.6.2.5 BigInt::divide ( x, y )

Soyut işlem BigInt::divide, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer y = 0 ise, bir RangeError kuraldışı durumu fırlat.

  2. quotient = (x) / (y) olsun.

  3. (truncate(quotient)) döndür.

6.1.6.2.6 BigInt::remainder ( numerator, denominator )

Soyut işlem BigInt::remainder, numerator (bir BigInt) ve denominator (bir BigInt) argümanlarını alır ve ya bir BigInt içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer denominator = 0 ise, bir RangeError kuraldışı durumu fırlat.

  2. Eğer numerator = 0 ise, 0 döndür.

  3. quotient = (numerator) / (denominator) olsun.

  4. truncatedQuotient = (truncate(quotient)) olsun.

  5. numerator - (denominator × truncatedQuotient) döndür.

6.1.6.2.7 BigInt::add ( x, y )

Soyut işlem BigInt::add, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. x + y'yi döndür.
6.1.6.2.8 BigInt::subtract ( x, y )

Soyut işlem BigInt::subtract, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. x - y'yi döndür.
6.1.6.2.9 BigInt::leftShift ( x, y )

Soyut işlem BigInt::leftShift, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer y < 0 ise,

    1. (floor((x) / 2-(y))) döndür.
  2. x × 2y döndür.

6.1.6.2.10 BigInt::signedRightShift ( x, y )

Soyut işlem BigInt::signedRightShift, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. BigInt::leftShift(x, -y) döndür.
6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

Soyut işlem BigInt::unsignedRightShift, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Bir TypeError kuraldışı durumu fırlat.
6.1.6.2.12 BigInt::lessThan ( x, y )

Soyut işlem BigInt::lessThan, x (bir BigInt) ve y (bir BigInt) 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 (x) < (y) ise, true döndür.

  2. false döndür.

6.1.6.2.13 BigInt::equal ( x, y )

Soyut işlem BigInt::equal, x (bir BigInt) ve y (bir BigInt) 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 (x) = (y) ise, true döndür.

  2. false döndür.

6.1.6.2.14 BinaryAnd ( x, y )

Soyut işlem BinaryAnd, x (0 veya 1) ve y (0 veya 1) argümanlarını alır ve 0 veya 1 döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x = 1 ve y = 1 ise, 1 döndür.

  2. 0 döndür.

6.1.6.2.15 BinaryOr ( x, y )

Soyut işlem BinaryOr, x (0 veya 1) ve y (0 veya 1) argümanlarını alır ve 0 veya 1 döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x = 1 veya y = 1 ise, 1 döndür.

  2. 0 döndür.

6.1.6.2.16 BinaryXor ( x, y )

Soyut işlem BinaryXor, x (0 veya 1) ve y (0 veya 1) argümanlarını alır ve 0 veya 1 döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x = 1 ve y = 0 ise, 1 döndür.

  2. Eğer x = 0 ve y = 1 ise, 1 döndür.

  3. 0 döndür.

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

Soyut işlem BigIntBitwiseOp, op (&, ^ veya |), x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. x'i (x) olarak ayarla.

  2. y'yi (y) olarak ayarla.

  3. result = 0 olsun.

  4. shift = 0 olsun.

  5. (x = 0 veya x = -1) ve (y = 0 veya y = -1) olana kadar tekrar et,

    1. xDigit = x modulo 2 olsun.

    2. yDigit = y modulo 2 olsun.

    3. Eğer op, & ise,

      1. result'u result + 2shift × BinaryAnd(xDigit, yDigit) olarak ayarla.
    4. Değilse, eğer op, | ise,

      1. result'u result + 2shift × BinaryOr(xDigit, yDigit) olarak ayarla.
    5. Değilse,

      1. Assert: op, ^'dir.

      2. result'u result + 2shift × BinaryXor(xDigit, yDigit) olarak ayarla.

    6. shift'i shift + 1 olarak ayarla.

    7. x'i (x - xDigit) / 2 olarak ayarla.

    8. y'yi (y - yDigit) / 2 olarak ayarla.

  6. Eğer op, & ise,

    1. tmp = BinaryAnd(x modulo 2, y modulo 2) olsun.
  7. Değilse, eğer op, | ise,

    1. tmp = BinaryOr(x modulo 2, y modulo 2) olsun.
  8. Değilse,

    1. Assert: op, ^'dir.

    2. tmp = BinaryXor(x modulo 2, y modulo 2) olsun.

  9. Eğer tmp ≠ 0 ise,

    1. result'u result - 2shift olarak ayarla.

    2. NOTE: Bu, işareti genişletir.

  10. result için BigInt value for değerini döndür.

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

Soyut işlem BigInt::bitwiseAND, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. BigIntBitwiseOp(&, x, y) döndür.
6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

Soyut işlem BigInt::bitwiseXOR, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. BigIntBitwiseOp(^, x, y) döndür.
6.1.6.2.20 BigInt::bitwiseOR ( x, y )

Soyut işlem BigInt::bitwiseOR, x (bir BigInt) ve y (bir BigInt) argümanlarını alır ve bir BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. BigIntBitwiseOp(|, x, y) döndür.
6.1.6.2.21 BigInt::toString ( x, radix )

Soyut işlem BigInt::toString, x (bir BigInt) ve radix (2 ile 36 dahil aralığında bir tamsayı) argümanlarını alır ve bir String döndürür. x'i, radix tabanında bir konumsal sayı sistemi kullanarak bir String olarak temsil eder. r tabanını kullanan bir BigInt'in gösteriminde kullanılan rakamlar, sırasıyla "0123456789abcdefghijklmnopqrstuvwxyz" dizgisinin ilk r kod biriminden alınır. 0 dışındaki BigInt'lerin gösterimi asla başta sıfır içermez. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer x < 0 ise, "-" ile BigInt::toString(-x, radix)'in dizgi birleştirmesini döndür.

  2. radix tabanında x'in gösteriminden oluşan String değerini döndür.

6.1.7 Object Türü

Object türünün, basitçe “bir Object” olarak da anılan her bir örneği, bir özellikler topluluğunu temsil eder. Her özellik ya bir veri özelliği ya da bir erişimci özelliğidir:

  • Bir veri özelliği, bir anahtar değerini bir ECMAScript dil değeri ve bir dizi Boolean nitelik ile ilişkilendirir.

  • Bir erişimci özelliği, bir anahtar değerini bir veya iki erişimci işlevi ve bir dizi Boolean nitelik ile ilişkilendirir. Erişimci işlevleri, özellikle ilişkili bir ECMAScript dil değerini depolamak veya almak için kullanılır.

Bir nesnenin özellikleri, özellik anahtarları kullanılarak biricik biçimde tanımlanır. Bir özellik anahtarı ya bir String ya da bir Symbol'dür. Boş String de dahil olmak üzere tüm String'ler ve Symbol'ler özellik anahtarı olarak geçerlidir. Bir özellik adı, bir String olan bir özellik anahtarıdır.

Bir tamsayı indisi, CanonicalNumericIndexString(n) işlevinin +0𝔽 ile 𝔽(253 - 1) dahil aralığında bir tam sayı Number döndürdüğü bir özellik adı n'dir. Bir dizi indisi, CanonicalNumericIndexString(n) işlevinin +0𝔽 ile 𝔽(232 - 2) dahil aralığında bir tam sayı Number döndürdüğü bir tamsayı indisi n'dir.

Özellik anahtarları, özelliklere ve değerlerine erişmek için kullanılır. Özellikler için iki tür erişim vardır: sırasıyla değer alma ve atamaya karşılık gelen get ve set. Get ve set erişimi yoluyla erişilebilen özellikler, hem bir nesnenin doğrudan bir parçası olan kendi özellikleri hem de bir özellik kalıtım ilişkisi aracılığıyla başka bir ilişkili nesne tarafından sağlanan kalıtılan özellikleri kapsar. Kalıtılan özellikler, ilişkili nesnenin kendi özellikleri veya kalıtılan özellikleri olabilir. Bir nesnenin her kendi özelliğinin, o nesnenin diğer kendi özelliklerinin anahtar değerlerinden farklı bir anahtar değerine sahip olması gerekir.

Tüm nesneler mantıksal olarak özellik topluluklarıdır, ancak özelliklerine erişme ve onları işleme anlambilimleri açısından farklılık gösteren birden çok nesne biçimi vardır. Çoklu nesne biçimlerinin tanımları için lütfen 6.1.7.2'ye bakınız.

Ayrıca, bazı nesneler çağrılabilirdir; bunlar işlevler veya işlev nesneleri olarak anılır ve aşağıda daha ayrıntılı açıklanmıştır. ECMAScript'teki tüm işlevler Object türünün üyeleridir.

6.1.7.1 Özellik Nitelikleri

Nitelikler, bu belirtimde, Tablo 3'te açıklandığı gibi Object özelliklerinin durumunu tanımlamak ve açıklamak için kullanılır. Açıkça belirtilmedikçe, her niteliğin başlangıç değeri, Varsayılan Değeridir.

Tablo 3: Bir Object özelliğinin Nitelikleri

Nitelik Adı Bulunduğu özellik türleri Değer Alanı Varsayılan Değer Açıklama
[[Value]] veri özelliği bir ECMAScript dil değeri undefined Özelliğin bir get erişimi ile alınan değer.
[[Writable]] veri özelliği bir Boolean false Eğer false ise, ECMAScript kodunun [[Set]] kullanarak özelliğin [[Value]] niteliğini değiştirme girişimleri başarılı olmaz.
[[Get]] erişimci özelliği bir Object veya undefined undefined Eğer değer bir Object ise, bir işlev nesnesi olmak zorundadır. Özelliğin bir get erişimi her gerçekleştirildiğinde, özellik değerini almak üzere işlevin [[Call]] iç yöntemi (Tablo 5) boş bir argüman listesiyle çağrılır.
[[Set]] erişimci özelliği bir Object veya undefined undefined Eğer değer bir Object ise, bir işlev nesnesi olmak zorundadır. Özelliğin bir set erişimi her gerçekleştirildiğinde, atanan değeri tek argümanı olarak içeren bir argüman listesiyle işlevin [[Call]] iç yöntemi (Tablo 5) çağrılır. Bir özelliğin [[Set]] iç yönteminin etkisi, özelliğin [[Get]] iç yöntemine yapılan sonraki çağrıların döndürdüğü değer üzerinde bir etkiye sahip olabilir, ancak olmak zorunda değildir.
[[Enumerable]] veri özelliği veya erişimci özelliği bir Boolean false Eğer true ise, özellik bir for-in numaralandırmasıyla numaralandırılacaktır (bkz. 14.7.5). Aksi takdirde, özelliğin numaralandırılamaz olduğu söylenir.
[[Configurable]] veri özelliği veya erişimci özelliği bir Boolean false Eğer false ise, özelliği silme, onu bir veri özelliğinden bir erişimci özelliğine veya bir erişimci özelliğinden bir veri özelliğine dönüştürme ya da niteliklerinde herhangi bir değişiklik yapma (mevcut bir [[Value]] değerini değiştirmek veya [[Writable]]false olarak ayarlamak dışında) girişimleri başarısız olacaktır.

6.1.7.2 Nesne İç Yöntemleri ve İç Yuvalar

ECMAScript'te nesnelerin asıl anlambilimi, iç yöntemler olarak adlandırılan algoritmalar aracılığıyla belirtilir. Bir ECMAScript motorundaki her nesne, çalışma zamanı davranışını tanımlayan bir dizi iç yöntemle ilişkilendirilir. Bu iç yöntemler ECMAScript dilinin bir parçası değildir. Bu belirtim tarafından yalnızca açıklayıcı amaçlarla tanımlanmışlardır. Bununla birlikte, bir ECMAScript gerçekleştirimi içerisindeki her nesne, kendisiyle ilişkilendirilmiş iç yöntemler tarafından belirtildiği gibi davranmak zorundadır. Bunun gerçekleştirilme biçimi gerçekleştirim tarafından belirlenir.

İç yöntem adları çok biçimlidir. Bu, ortak bir iç yöntem adı üzerlerinde çağrıldığında farklı nesne değerlerinin farklı algoritmalar gerçekleştirebileceği anlamına gelir. Bir iç yöntemin üzerinde çağrıldığı asıl nesne, çağrının “hedefi”dir. Eğer çalışma zamanında, bir algoritmanın gerçekleştirimi, bir nesnenin desteklemediği bir iç yöntemini kullanmaya çalışırsa, bir TypeError kuraldışı durumu fırlatılır.

İç yuvalar, nesneler, Symbol'ler veya Özel Adlar ile ilişkilendirilen ve çeşitli ECMAScript belirtim algoritmaları tarafından kullanılan iç duruma karşılık gelir. İç yuvalar, nesne özellikleri değildir ve kalıtılmazlar. Belirli iç yuva belirtimine bağlı olarak, bu tür durum, herhangi bir ECMAScript dil türüne ait değerlerden veya belirli ECMAScript belirtim türü değerlerinden oluşabilir. Açıkça aksi belirtilmedikçe, iç yuvalar bir nesne, Symbol veya Özel Ad oluşturma sürecinin bir parçası olarak tahsis edilir ve dinamik olarak eklenemez. Aksi belirtilmedikçe, bir iç yuvanın başlangıç değeri undefined değeridir. Bu belirtim içerisindeki çeşitli algoritmalar, iç yuvaları olan değerler oluşturur. Ancak, ECMAScript dili iç yuvaları işlemek için doğrudan bir yol sağlamaz.

Tüm nesneler, PrivateElements öğelerinin bir Listesi olan [[PrivateElements]] adlı bir iç yuvaya sahiptir. Bu Liste, nesne için özel alanların, yöntemlerin ve erişimcilerin değerlerini temsil eder. Başlangıçta boş bir Listedir.

İç yöntemler ve iç yuvalar, bu belirtim içerisinde çift köşeli parantez [[ ]] içine alınmış adlar kullanılarak tanımlanır.

Tablo 4, ECMAScript kodu tarafından oluşturulan veya işlenen tüm nesnelere uygulanabilen, bu belirtim tarafından kullanılan temel iç yöntemleri özetlemektedir. Her nesne, tüm temel iç yöntemler için algoritmalara sahip olmak zorundadır. Ancak, tüm nesneler bu yöntemler için mutlaka aynı algoritmaları kullanmaz.

Bir sıradan nesne, aşağıdaki ölçütlerin tümünü karşılayan bir nesnedir:

  • Tablo 4'te listelenen iç yöntemler için, nesne 10.1'de tanımlananları kullanır.

  • Eğer nesnenin bir [[Call]] iç yöntemi varsa, ya 10.2.1'de tanımlananı ya da 10.3.1'de tanımlananı kullanır.

  • Eğer nesnenin bir [[Construct]] iç yöntemi varsa, ya 10.2.2'de tanımlananı ya da 10.3.2'de tanımlananı kullanır.

Bir egzotik nesne, bir sıradan nesne olmayan bir nesnedir.

Bu belirtim, egzotik nesnelerin farklı türlerini, bu nesnelerin iç yöntemleri aracılığıyla tanır. Belirli bir tür egzotik nesneye (örneğin bir Array egzotik nesnesi veya bir bound function egzotik nesnesi) davranışsal olarak eşdeğer olan, ancak o tür için belirtilen iç yöntemler topluluğuna sahip olmayan bir nesne, o tür egzotik nesne olarak tanınmaz.

Tablo 4'ün ve diğer benzer tabloların “İmza” sütunu, her iç yöntem için çağrı örüntüsünü açıklar. Çağrı örüntüsü her zaman, betimleyici parametre adlarından oluşan parantezli bir liste içerir. Bir parametre adı bir ECMAScript tür adı ile aynı ise, bu ad, parametre değerinin gerekli türünü tanımlar. Eğer bir iç yöntem açıkça bir değer döndürürse, parametre listesinin ardından “→” sembolü ve döndürülen değerin tür adı gelir. İmzalarda kullanılan tür adları, aşağıdaki ek adlarla genişletilmiş madde 6'da tanımlanan türlere atıfta bulunur. “any”, değerin herhangi bir ECMAScript dil türü olabileceği anlamına gelir.

Parametrelerine ek olarak, bir iç yöntemin her zaman, yöntem çağrısının hedefi olan nesneye erişimi vardır.

Bir iç yöntem, örtük olarak bir Completion Record döndürür; bu, ya çağrı örüntüsünde gösterilen dönüş türünde bir değeri saran bir normal tamamlanma ya da bir fırlatma tamamlanmasıdır.

Tablo 4: Temel İç Yöntemler

İç Yöntem İmza Açıklama
[[GetPrototypeOf]] ( ) Object Null
[[SetPrototypeOf]] (Object Null) Boolean
[[IsExtensible]] ( ) Boolean Bu nesneye ek özellikler eklenmesine izin verilip verilmediğini belirler.
[[PreventExtensions]] ( ) Boolean Bu nesneye yeni özellikler eklenip eklenemeyeceğini denetler. İşlem başarılı olduysa true, işlem başarısız olduysa false döndürür.
[[GetOwnProperty]] (propertyKey) Undefined Property Descriptor
[[DefineOwnProperty]] (propertyKey, propertyDesc) Boolean Anahtarı propertyKey olan kendi özelliğini, propertyDesc tarafından açıklanan duruma sahip olacak şekilde oluşturur veya değiştirir. Özellik başarıyla oluşturulduysa/güncellendiyse true, özellik oluşturulamadıysa veya güncellenemediyse false döndürür.
[[HasProperty]] (propertyKey) Boolean Bu nesnenin halihazırda anahtarı propertyKey olan bir kendi veya kalıtılan özelliğe sahip olup olmadığını belirten bir Boolean değer döndürür.
[[Get]] (propertyKey, receiver) any Anahtarı propertyKey olan özelliğin değerini bu nesneden döndürür. Özellik değerini almak için herhangi bir ECMAScript kodunun yürütülmesi gerekiyorsa, kod değerlendirilirken receiver this değeri olarak kullanılır.
[[Set]] (propertyKey, value, receiver) Boolean Anahtarı propertyKey olan özelliğin değerini value olarak ayarlar. Özellik değerini ayarlamak için herhangi bir ECMAScript kodunun yürütülmesi gerekiyorsa, kod değerlendirilirken receiver this değeri olarak kullanılır. Özellik değeri ayarlandıysa true, ayarlanamadıysa false döndürür.
[[Delete]] (propertyKey) Boolean Anahtarı propertyKey olan kendi özelliğini bu nesneden kaldırır. Özellik silinmediyse ve hala mevcutsa false döndürür. Özellik silindiyse veya mevcut değilse true döndürür.
[[OwnPropertyKeys]] ( ) List of property keys Öğeleri, nesnenin tüm kendi özellik anahtarları olan bir Liste döndürür.

Tablo 5, işlev olarak çağrılabilen nesneler tarafından desteklenen ek temel iç yöntemleri özetlemektedir. Bir işlev nesnesi, [[Call]] iç yöntemini destekleyen bir nesnedir. Bir oluşturucu, [[Construct]] iç yöntemini destekleyen bir nesnedir. [[Construct]]'i destekleyen her nesne [[Call]]'i de desteklemek zorundadır; yani her oluşturucu, bir işlev nesnesi olmak zorundadır. Bu nedenle, bir oluşturucu aynı zamanda bir oluşturucu işlevi veya oluşturucu işlev nesnesi olarak da anılabilir.

Tablo 5: İşlev Nesnelerinin Ek Temel İç Yöntemleri

İç Yöntem İmza Açıklama
[[Call]] (any, any öğelerinden oluşan bir Liste) any Bu nesne ile ilişkili kodu yürütür. Bir işlev çağrı ifadesi aracılığıyla çağrılır. İç yönteme verilen argümanlar, bir this değeri ve öğeleri, bir çağrı ifadesi ile işleve geçirilen argümanlar olan bir Listedir. Bu iç yöntemi gerçekleştiren nesneler çağrılabilirdir.
[[Construct]] (any öğelerinden oluşan bir Liste, Object) Object Bir nesne oluşturur. new işleci veya bir super çağrısı aracılığıyla çağrılır. İç yönteme verilen ilk argüman, öğeleri oluşturucu çağrısının veya super çağrısının argümanları olan bir Listedir. İkinci argüman, new işlecinin başlangıçta uygulandığı nesnedir. Bu iç yöntemi gerçekleştiren nesneler oluşturucular olarak adlandırılır. Bir işlev nesnesi mutlaka bir oluşturucu olmak zorunda değildir ve bu tür oluşturucu olmayan işlev nesnelerinin bir [[Construct]] iç yöntemi yoktur.

Sıradan nesneler ve standart egzotik nesneler için temel iç yöntemlerin anlambilimi, madde 10'da belirtilmiştir. Bir egzotik nesnenin bir iç yönteminin herhangi bir belirtilen kullanımı bir gerçekleştirim tarafından desteklenmiyorsa, bu kullanım denendiğinde bir TypeError kuraldışı durumu fırlatmak zorundadır.

6.1.7.3 Temel İç Yöntemlerin Değişmezleri

Bir ECMAScript motorunun Nesnelerinin İç Yöntemleri, aşağıda belirtilen değişmezler listesine uymak zorundadır. Sıradan ECMAScript Nesneleri ve bu belirtimdeki tüm standart egzotik nesneler bu değişmezleri sağlar. ECMAScript Proxy nesneleri, bu değişmezleri, [[ProxyHandler]] nesnesi üzerinde çağrılan tuzakların sonucu üzerinde yapılan çalışma zamanı denetimleri aracılığıyla sağlar.

Gerçekleştirim tarafından sağlanan herhangi bir egzotik nesne de, bu nesneler için bu değişmezleri sağlamak zorundadır. Bu değişmezlerin ihlali, ECMAScript kodunun öngörülemez davranış sergilemesine ve güvenlik sorunları yaratmasına neden olabilir. Ancak, bu değişmezlerin ihlali, bir gerçekleştirimin bellek güvenliğini asla tehlikeye atmamalıdır.

Bir gerçekleştirim, bu değişmezlerin, örneğin temel iç yöntemlerin işlevselliğini değişmezlerini zorlamaksızın gerçekleştiren alternatif arayüzler sağlamak gibi herhangi bir yolla aşılmasına izin vermemelidir.

Tanımlar:
  • Bir iç yöntemin hedefi, iç yöntemin üzerinde çağrıldığı nesnedir.

  • Bir hedef, eğer [[IsExtensible]] iç yönteminden false veya [[PreventExtensions]] iç yönteminden true döndürdüğü gözlemlendiyse, genişletilemezdir.

  • Mevcut olmayan bir özellik, genişletilemez bir hedef üzerinde kendi özelliği olarak mevcut olmayan bir özelliktir.

  • SameValue'ya yapılan tüm atıflar, SameValue algoritmasının tanımına göredir.

Dönüş değeri:

Herhangi bir iç yöntem tarafından döndürülen değer, aşağıdakilerden birine sahip bir Completion Record olmak zorundadır:

  • [[Type]] = normal, [[Target]] = empty ve [[Value]] = o iç yöntem için aşağıda gösterilen “normal dönüş türü”nde bir değer, veya

  • [[Type]] = throw, [[Target]] = empty ve [[Value]] = herhangi bir ECMAScript dil değeri.

[[GetPrototypeOf]] ( )
  • Normal dönüş türü, Object veya Null'dur.

  • Eğer hedef genişletilemez ise ve [[GetPrototypeOf]] bir proto değeri döndürürse, [[GetPrototypeOf]]'a yapılan gelecekteki tüm çağrılar proto ile SameValue olanı döndürmelidir.

[[SetPrototypeOf]] ( proto )
  • Normal dönüş türü Boolean'dır.

  • Eğer hedef genişletilemez ise, proto, hedefin gözlemlenen [[GetPrototypeOf]] değeri ile SameValue olmadıkça, [[SetPrototypeOf]] false döndürmek zorundadır.

[[IsExtensible]] ( )
  • Normal dönüş türü Boolean'dır.

  • Eğer [[IsExtensible]] false döndürürse, hedef üzerinde [[IsExtensible]]'a yapılan gelecekteki tüm çağrılar false döndürmek zorundadır.

[[PreventExtensions]] ( )
  • Normal dönüş türü Boolean'dır.

  • Eğer [[PreventExtensions]] true döndürürse, hedef üzerinde [[IsExtensible]]'a yapılan gelecekteki tüm çağrılar false döndürmek zorundadır ve hedef artık genişletilemez olarak kabul edilir.

[[GetOwnProperty]] ( propertyKey )
  • Normal dönüş türü, ya Property Descriptor ya da Undefined'dır.

  • Eğer dönüş değeri bir Property Descriptor ise, bu, tam olarak doldurulmuş bir Property Descriptor olmak zorundadır.

  • Eğer propertyKey, yapılandırılamaz, yazılamaz bir kendi veri özelliği olarak tanımlanırsa, [[GetOwnProperty]] ( propertyKey )'e yapılan gelecekteki tüm çağrılar, [[Value]] değeri propertyKey'in [[Value]] niteliği ile SameValue olan bir Property Descriptor döndürmek zorundadır.

  • Eğer propertyKey'in [[Writable]] ve [[Value]] dışındaki nitelikleri zamanla değişebilirse veya özellik silinebilirse, o zaman propertyKey'in [[Configurable]] niteliği true olmak zorundadır.

  • Eğer [[Writable]] niteliği false'dan true'ya değişebilirse, o zaman [[Configurable]] niteliği true olmak zorundadır.

  • Eğer hedef genişletilemez ise ve propertyKey mevcut değil ise, o zaman hedef üzerinde [[GetOwnProperty]] (propertyKey)'e yapılan gelecekteki tüm çağrılar, propertyKey'i mevcut değil olarak tanımlamak zorundadır (yani [[GetOwnProperty]] (propertyKey) undefined döndürmek zorundadır).

[[DefineOwnProperty]] ( propertyKey, propertyDesc )
  • Normal dönüş türü Boolean'dır.

  • [[DefineOwnProperty]], eğer propertyKey daha önce hedefin yapılandırılamaz bir kendi özelliği olarak gözlemlendiyse, aşağıdaki durumlardan biri olmadıkça false döndürmek zorundadır:

    1. propertyKey, yazılabilir bir veri özelliğidir. Yapılandırılamaz yazılabilir bir veri özelliği, yapılandırılamaz yazılamaz bir veri özelliğine dönüştürülebilir.

    2. propertyDesc'in tüm nitelikleri, propertyKey'in nitelikleri ile SameValue'dur.

  • Eğer hedef genişletilemez ise ve propertyKey mevcut olmayan bir kendi özelliği ise, [[DefineOwnProperty]] (propertyKey, propertyDesc) false döndürmek zorundadır. Yani, genişletilemez bir hedef nesne, yeni özelliklerle genişletilemez.

[[HasProperty]] ( propertyKey )
  • Normal dönüş türü Boolean'dır.

  • Eğer propertyKey, daha önce hedefin yapılandırılamaz bir kendi veri veya erişimci özelliği olarak gözlemlendiyse, [[HasProperty]] true döndürmek zorundadır.

[[Get]] ( propertyKey, receiver )
  • Normal dönüş türü, herhangi bir ECMAScript dil türüdür.

  • Eğer propertyKey, daha önce hedefin, değeri value olan yapılandırılamaz, yazılamaz bir kendi veri özelliği olarak gözlemlendiyse, [[Get]] value ile SameValue olanı döndürmek zorundadır.

  • Eğer propertyKey, daha önce hedefin, [[Get]] niteliği undefined olan yapılandırılamaz bir kendi erişimci özelliği olarak gözlemlendiyse, [[Get]] işlemi undefined döndürmek zorundadır.

[[Set]] ( propertyKey, value, receiver )
  • Normal dönüş türü Boolean'dır.

  • Eğer propertyKey, daha önce hedefin yapılandırılamaz, yazılamaz bir kendi veri özelliği olarak gözlemlendiyse, value, propertyKey'in [[Value]] niteliği ile SameValue olmadıkça, [[Set]] false döndürmek zorundadır.

  • Eğer propertyKey, daha önce hedefin, [[Set]] niteliği undefined olan yapılandırılamaz bir kendi erişimci özelliği olarak gözlemlendiyse, [[Set]] işlemi false döndürmek zorundadır.

[[Delete]] ( propertyKey )
  • Normal dönüş türü Boolean'dır.

  • Eğer propertyKey, daha önce hedefin yapılandırılamaz bir kendi veri veya erişimci özelliği olarak gözlemlendiyse, [[Delete]] false döndürmek zorundadır.

[[OwnPropertyKeys]] ( )
  • Normal dönüş türü Listedir.

  • Döndürülen Liste herhangi bir yinelenen girdi içermemelidir.

  • Döndürülen Liste'nin her öğesi bir özellik anahtarı olmak zorundadır.

  • Döndürülen Liste, daha önce gözlemlenmiş tüm yapılandırılamaz kendi özelliklerinin anahtarlarını en azından içermek zorundadır.

  • Eğer hedef genişletilemez ise, döndürülen Liste, yalnızca hedefin [[GetOwnProperty]] kullanılarak gözlemlenebilir tüm kendi özelliklerinin anahtarlarını içermek zorundadır.

[[Call]] ( )
[[Construct]] ( )
  • Normal dönüş türü Object'tir.

  • Hedefin aynı zamanda bir [[Call]] iç yöntemine sahip olması zorunludur.

6.1.7.4 İyi Bilinen İçkin Nesneler

İyi bilinen içkinler, bu belirtimin algoritmaları tarafından açıkça atıfta bulunulan ve genellikle gerçeklik alanına özgü kimliklere sahip olan yerleşik nesnelerdir. Aksi belirtilmedikçe, her içkin nesne aslında benzer nesnelerden oluşan bir kümeye karşılık gelir; her gerçeklik alanı için bir tane.

Bu belirtim içerisinde, %name% gibi bir başvuru, mevcut gerçeklik alanı ile ilişkili olan ve ada karşılık gelen içkin nesne anlamına gelir. %name.a.b% gibi bir başvuru ise, %name% içkin nesnesinin "a" özelliğinin değerinin "b" özelliğine, herhangi bir ECMAScript kodu değerlendirilmeden önce erişilmiş gibi anlamına gelir. Mevcut gerçeklik alanının ve içkinlerinin belirlenmesi 9.4'te açıklanmıştır. İyi bilinen içkinler Tablo 6'da listelenmiştir.

Tablo 6: İyi Bilinen İçkin Nesneler

İçkin Adı Küresel Ad ECMAScript Dili İlişkilendirmesi
%AggregateError% "AggregateError" AggregateError oluşturucusu (20.5.7.1)
%Array% "Array" Array oluşturucusu (23.1.1)
%ArrayBuffer% "ArrayBuffer" ArrayBuffer oluşturucusu (25.1.4)
%ArrayIteratorPrototype% Array Iterator nesnelerinin prototipi (23.1.5)
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator nesnelerinin prototipi (27.1.5)
%AsyncFunction% async işlev nesnelerinin oluşturucusu (27.7.1)
%AsyncGeneratorFunction% async generator işlev nesnelerinin oluşturucusu (27.4.1)
%AsyncGeneratorPrototype% async generator nesnelerinin prototipi (27.6)
%AsyncIteratorPrototype% Tüm standart yerleşik async iterator nesnelerinin dolaylı olarak miras aldığı bir nesne
%Atomics% "Atomics" Atomics nesnesi (25.4)
%BigInt% "BigInt" BigInt oluşturucusu (21.2.1)
%BigInt64Array% "BigInt64Array" BigInt64Array oluşturucusu (23.2)
%BigUint64Array% "BigUint64Array" BigUint64Array oluşturucusu (23.2)
%Boolean% "Boolean" Boolean oluşturucusu (20.3.1)
%DataView% "DataView" DataView oluşturucusu (25.3.2)
%Date% "Date" Date oluşturucusu (21.4.2)
%decodeURI% "decodeURI" decodeURI işlevi (19.2.6.1)
%decodeURIComponent% "decodeURIComponent" decodeURIComponent işlevi (19.2.6.2)
%encodeURI% "encodeURI" encodeURI işlevi (19.2.6.3)
%encodeURIComponent% "encodeURIComponent" encodeURIComponent işlevi (19.2.6.4)
%Error% "Error" Error oluşturucusu (20.5.1)
%eval% "eval" eval işlevi (19.2.1)
%EvalError% "EvalError" EvalError oluşturucusu (20.5.5.1)
%FinalizationRegistry% "FinalizationRegistry" FinalizationRegistry oluşturucusu (26.2.1)
%Float16Array% "Float16Array" Float16Array oluşturucusu (23.2)
%Float32Array% "Float32Array" Float32Array oluşturucusu (23.2)
%Float64Array% "Float64Array" Float64Array oluşturucusu (23.2)
%ForInIteratorPrototype% For-In Iterator nesnelerinin prototipi (14.7.5.10)
%Function% "Function" Function oluşturucusu (20.2.1)
%GeneratorFunction% generator işlev nesnelerinin oluşturucusu (27.3.1)
%GeneratorPrototype% generator nesnelerinin prototipi (27.5)
%Int8Array% "Int8Array" Int8Array oluşturucusu (23.2)
%Int16Array% "Int16Array" Int16Array oluşturucusu (23.2)
%Int32Array% "Int32Array" Int32Array oluşturucusu (23.2)
%isFinite% "isFinite" isFinite işlevi (19.2.2)
%isNaN% "isNaN" isNaN işlevi (19.2.3)
%Iterator% "Iterator" Iterator oluşturucusu (27.1.3.1)
%IteratorHelperPrototype% Iterator Helper nesnelerinin prototipi (27.1.2.1)
%JSON% "JSON" JSON nesnesi (25.5)
%Map% "Map" Map oluşturucusu (24.1.1)
%MapIteratorPrototype% Map Iterator nesnelerinin prototipi (24.1.5)
%Math% "Math" Math nesnesi (21.3)
%Number% "Number" Number oluşturucusu (21.1.1)
%Object% "Object" Object oluşturucusu (20.1.1)
%parseFloat% "parseFloat" parseFloat işlevi (19.2.4)
%parseInt% "parseInt" parseInt işlevi (19.2.5)
%Promise% "Promise" Promise oluşturucusu (27.2.3)
%Proxy% "Proxy" Proxy oluşturucusu (28.2.1)
%RangeError% "RangeError" RangeError oluşturucusu (20.5.5.2)
%ReferenceError% "ReferenceError" ReferenceError oluşturucusu (20.5.5.3)
%Reflect% "Reflect" Reflect nesnesi (28.1)
%RegExp% "RegExp" RegExp oluşturucusu (22.2.4)
%RegExpStringIteratorPrototype% RegExp String Iterator nesnelerinin prototipi (22.2.9)
%Set% "Set" Set oluşturucusu (24.2.2)
%SetIteratorPrototype% Set Iterator nesnelerinin prototipi (24.2.6)
%SharedArrayBuffer% "SharedArrayBuffer" SharedArrayBuffer oluşturucusu (25.2.3)
%String% "String" String oluşturucusu (22.1.1)
%StringIteratorPrototype% String Iterator nesnelerinin prototipi (22.1.5)
%Symbol% "Symbol" Symbol oluşturucusu (20.4.1)
%SyntaxError% "SyntaxError" SyntaxError oluşturucusu (20.5.5.4)
%ThrowTypeError% Koşulsuz olarak yeni bir %TypeError% örneği fırlatan bir işlev nesnesi
%TypedArray% Tüm tipli Dizi oluşturucularının üst sınıfı (23.2.1)
%TypeError% "TypeError" TypeError oluşturucusu (20.5.5.5)
%Uint8Array% "Uint8Array" Uint8Array oluşturucusu (23.2)
%Uint8ClampedArray% "Uint8ClampedArray" Uint8ClampedArray oluşturucusu (23.2)
%Uint16Array% "Uint16Array" Uint16Array oluşturucusu (23.2)
%Uint32Array% "Uint32Array" Uint32Array oluşturucusu (23.2)
%URIError% "URIError" URIError oluşturucusu (20.5.5.6)
%WeakMap% "WeakMap" WeakMap oluşturucusu (24.3.1)
%WeakRef% "WeakRef" WeakRef oluşturucusu (26.1.1)
%WeakSet% "WeakSet" WeakSet oluşturucusu (24.4.1)
%WrapForValidIteratorPrototype% Iterator.from tarafından döndürülen sarmalanmış iterator nesnelerinin prototipi (27.1.3.2.2.1)

6.2 ECMAScript Belirtim Türleri

Bir belirtim türü, ECMAScript dil yapılarının ve ECMAScript dil türlerinin anlambilimini tanımlamak üzere algoritmalar içerisinde kullanılan üst-değerlere karşılık gelir. Belirtim türleri Reference Record, Liste, Completion Record, Property Descriptor, Environment Record, Abstract Closure ve Data Block'u içerir. Belirtim türü değerleri, bir ECMAScript gerçekleştirimi içerisinde herhangi bir belirli varlığa mutlaka karşılık gelmeyen belirtim yapıtlarıdır. Belirtim türü değerleri, ECMAScript ifadesi değerlendirmesinin ara sonuçlarını tanımlamak için kullanılabilir, ancak bu tür değerler nesnelerin özellikleri veya ECMAScript dil değişkenlerinin değerleri olarak depolanamaz.

6.2.1 Enum Belirtim Türü

Enum'lar, belirtime özgü olan ve ECMAScript kodundan doğrudan gözlemlenemeyen değerlerdir. Enum'lar, sans-serif yazı tipi kullanılarak büyük tireli harf biçiminde gösterilir. Örneğin, bir Completion Record'ın [[Type]] alanı, normal, return veya throw gibi değerler alır. Enum'ların adlarından başka hiçbir özelliği yoktur. Bir enum'ın adı, onu diğer enum'lardan ayırt etmekten başka bir amaca hizmet etmez ve bağlam içindeki kullanımı veya anlamı hakkında hiçbir şey ima etmez.

6.2.2 Liste ve Record Belirtim Türleri

Liste türü, new ifadelerindeki, işlev çağrılarındaki argüman listelerinin ve basit bir sıralı değer listesine ihtiyaç duyulan diğer algoritmalardaki değerlendirilmesini açıklamak için kullanılır (bkz. 13.3.8). Liste türünün değerleri, bireysel değerleri içeren liste öğelerinin basitçe sıralı dizileridir. Bu diziler herhangi bir uzunlukta olabilir. Bir listenin öğelerine, 0 tabanlı indisler kullanılarak rastgele erişilebilir. Gösterim kolaylığı için, Liste öğelerine erişmek üzere dizi benzeri bir sözdizimi kullanılabilir. Örneğin, args[2], args Listesinin 3üncü öğesini söylemenin kısayoludur.

Bir algoritma, bir sıra belirtmeksizin bir Listenin öğeleri üzerinde yinelediğinde, kullanılan sıra, Listedeki öğelerin sırasıdır.

Bu belirtim içerisinde gösterim kolaylığı için, yeni bir Liste değerini ifade etmek üzere bir değişmez sözdizimi kullanılabilir. Örneğin, « 1, 2 », her biri belirli bir değere ilklendirilmiş iki öğesi olan bir Liste değeri tanımlar. Yeni bir boş Liste « » olarak ifade edilebilir.

Bu belirtimde, “A, B, ...'nin liste birleştirmesi” ifadesi (burada her argüman muhtemelen boş bir Listedir), öğeleri, argümanların her birinin (sırasıyla) öğelerinin (sırasıyla) birleştirilmesi olan yeni bir Liste değerini belirtir.

String'lerden oluşan bir Listeye uygulandığında, “sözcüksel kod birimi sırasına göre sıralanmış” ifadesi, soyut işlem IsLessThan'da açıklandığı gibi, daha kısa olan dizginin sonuna kadar her kod biriminin sayısal değerine göre sıralamayı ve tümü eşitse daha kısa dizgiyi daha uzun dizgiden önce sıralamayı ifade eder.

Record türü, bu belirtimin algoritmaları içerisindeki veri kümelenmelerini tanımlamak için kullanılır. Bir Record türü değeri, bir veya daha fazla adlandırılmış alandan oluşur. Her alanın değeri, bir ECMAScript dil değeri veya belirtim değeridir. Alan adları her zaman çift köşeli parantez içine alınır, örneğin [[Value]].

Bu belirtim içerisinde gösterim kolaylığı için, bir Record değerini ifade etmek üzere nesne değişmezi benzeri bir sözdizimi kullanılabilir. Örneğin, { [[Field1]]: 42, [[Field2]]: false, [[Field3]]: empty }, her biri belirli bir değere ilklendirilmiş üç alanı olan bir Record değeri tanımlar. Alan adı sırası önemli değildir. Açıkça listelenmeyen herhangi bir alanın mevcut olmadığı kabul edilir.

Belirtim metninde ve algoritmalarda, bir Record değerinin belirli bir alanına atıfta bulunmak için nokta gösterimi kullanılabilir. Örneğin, R, bir önceki paragrafta gösterilen record ise, R.[[Field2]], “R'nin [[Field2]] adlı alanı” için kısayoldur.

Yaygın olarak kullanılan Record alan birleşimleri için şemalar adlandırılabilir ve bu ad, tanımlanan belirli kümelenme türünü belirlemek üzere değişmez bir Record değerine önek olarak kullanılabilir. Örneğin: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }.

6.2.3 Küme ve Bağıntı Belirtim Türleri

Küme türü, bellek modelinde kullanılmak üzere sırasız öğeler topluluğunu açıklamak için kullanılır. Aynı ada sahip ECMAScript koleksiyon türünden farklıdır. Anlam ayrımı için, ECMAScript koleksiyonunun örnekleri bu belirtim içerisinde tutarlı olarak “Set nesneleri” olarak anılır. Küme türünün değerleri, hiçbir öğenin birden fazla kez görünmediği basit öğe topluluklarıdır. Öğeler Kümelere eklenebilir ve Kümelerden çıkarılabilir. Kümeler birleştirilebilir, kesiştirilebilir veya birbirinden çıkarılabilir.

Bağıntı türü, Kümeler üzerindeki kısıtlamaları açıklamak için kullanılır. Bağıntı türünün değerleri, değer alanından gelen değerlerin sıralı çiftlerinin Kümeleridir. Örneğin, Bellek olayları üzerindeki bir Bağıntı, Bellek olaylarının sıralı çiftlerinin bir kümesidir. Bir R Bağıntısı ve R'nin değer alanındaki a ve b değerleri için, a R b, (a, b) sıralı çiftinin R'nin bir üyesi olduğunu söylemenin kısayoludur. Bir Bağıntı, bazı koşullara göre en küçük Bağıntı, bu koşulları sağlayan en küçük Bağıntı olduğunda söz konusudur.

Bir katı kısmi sıralama, aşağıdakileri sağlayan bir Bağıntı değeri R'dir.

  • R'nin tanım kümesindeki tüm a, b ve c için:

    • a R a olması söz konusu değildir, ve

    • Eğer a R b ve b R c ise, o zaman a R c'dir.

Bir katı tam sıralama, aşağıdakileri sağlayan bir Bağıntı değeri R'dir.

  • R'nin tanım kümesindeki tüm a, b ve c için:

    • a, b'dir veya a R b'dir veya b R a'dır, ve

    • a R a olması söz konusu değildir, ve

    • Eğer a R b ve b R c ise, o zaman a R c'dir.

6.2.4 Completion Record Belirtim Türü

Completion Record belirtim türü, değerlerin ve break, continue, return ve throw gibi yerel olmayan denetim aktarımları gerçekleştiren deyimlerin davranışı gibi denetim akışının çalışma zamanı yayılımını açıklamak için kullanılır.

Completion Record'lar, Tablo 7'de tanımlanan alanlara sahiptir.

Tablo 7: Completion Record Alanları

Alan Adı Değer Anlamı
[[Type]] normal, break, continue, return veya throw Meydana gelen tamamlanmanın türü.
[[Value]] bir Completion Record dışında herhangi bir değer Üretilen değer.
[[Target]] bir String veya empty Yönlendirilmiş denetim aktarımları için hedef etiketi.

Completion Record'lara atıfta bulunmak için bazen aşağıdaki kısayol terimleri kullanılır.

  • normal tamamlanma, [[Type]] değeri normal olan herhangi bir Completion Record'a atıfta bulunur.

  • break tamamlanması, [[Type]] değeri break olan herhangi bir Completion Record'a atıfta bulunur.

  • continue tamamlanması, [[Type]] değeri continue olan herhangi bir Completion Record'a atıfta bulunur.

  • return tamamlanması, [[Type]] değeri return olan herhangi bir Completion Record'a atıfta bulunur.

  • throw tamamlanması, [[Type]] değeri throw olan herhangi bir Completion Record'a atıfta bulunur.

  • ani tamamlanma, [[Type]] değeri normal dışında olan herhangi bir Completion Record'a atıfta bulunur.

  • bir tür değer içeren normal tamamlanma, [[Value]] alanında o türde bir değere sahip olan bir normal tamamlanmaya atıfta bulunur.

Bu belirtimde tanımlanan çağrılabilir nesneler yalnızca bir normal tamamlanma veya bir throw tamamlanması döndürür. Başka herhangi bir tür Completion Record döndürmek, bir yazım hatası olarak kabul edilir.

Gerçekleştirim tanımlı çağrılabilir nesneler, ya bir normal tamamlanma ya da bir throw tamamlanması döndürmek zorundadır.

6.2.4.1 NormalCompletion ( value )

Soyut işlem NormalCompletion, value (bir Completion Record dışında herhangi bir değer) argümanını alır ve bir normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Completion Record { [[Type]]: normal, [[Value]]: value, [[Target]]: empty } döndür.

6.2.4.2 ThrowCompletion ( value )

Soyut işlem ThrowCompletion, value (bir ECMAScript dil değeri) argümanını alır ve bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Completion Record { [[Type]]: throw, [[Value]]: value, [[Target]]: empty } döndür.

6.2.4.3 ReturnCompletion ( value )

Soyut işlem ReturnCompletion, value (bir ECMAScript dil değeri) argümanını alır ve bir return tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Completion Record { [[Type]]: return, [[Value]]: value, [[Target]]: empty } döndür.

6.2.4.4 UpdateEmpty ( completionRecord, value )

Soyut işlem UpdateEmpty, completionRecord (bir Completion Record) ve value (bir Completion Record dışında herhangi bir değer) argümanlarını alır ve bir Completion Record döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Eğer completionRecord bir return tamamlanması veya bir throw tamamlanması ise, o zaman completionRecord.[[Value]] empty değildir.

  2. Eğer completionRecord.[[Value]] empty değilse, ? completionRecord döndür.

  3. Completion Record { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] } döndür.

6.2.5 Reference Record Belirtim Türü

Reference Record türü, delete, typeof gibi işleçlerin, atama işleçlerinin, super anahtar sözcüğünün ve diğer dil özelliklerinin davranışını açıklamak için kullanılır. Örneğin, bir atamanın sol taraf işleneninin bir Reference Record üretmesi beklenir.

Bir Reference Record, çözümlenmiş bir ad veya (muhtemelen henüz çözümlenmemiş) bir özellik bağlamasıdır; alanları Tablo 8 ile tanımlanır.

Tablo 8: Reference Record Alanları

Alan Adı Değer Anlamı
[[Base]] bir ECMAScript dil değeri, bir Environment Record veya unresolvable Bağlamayı tutan değer veya Environment Record. [[Base]] değerinin unresolvable olması, bağlamanın çözümlenemediğini gösterir.
[[ReferencedName]] bir ECMAScript dil değeri veya bir Private Name Bağlamanın adı. Eğer [[Base]] değeri bir Environment Record ise her zaman bir String'dir. Aksi takdirde, ToPropertyKey gerçekleştirilene kadar bir String veya bir Symbol dışında bir ECMAScript dil değeri olabilir.
[[Strict]] bir Boolean Eğer Reference Record katı kip kodunda ortaya çıktıysa true, aksi takdirde false.
[[ThisValue]] bir ECMAScript dil değeri veya empty Eğer empty değilse, Reference Record, super anahtar sözcüğü kullanılarak ifade edilmiş bir özellik bağlamasını temsil eder; buna Super Reference Record denir ve [[Base]] değeri asla bir Environment Record olmaz. Bu durumda, [[ThisValue]] alanı, Reference Record oluşturulduğu andaki this değerini tutar.

Aşağıdaki soyut işlemler, bu belirtimde Reference Record'lar üzerinde işlem yapmak için kullanılır:

6.2.5.1 IsPropertyReference ( refRecord )

Soyut işlem IsPropertyReference, refRecord (bir Reference Record) argümanı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 refRecord.[[Base]] unresolvable ise, false döndür.

  2. Eğer refRecord.[[Base]] bir Environment Record ise, false döndür.

  3. true döndür.

6.2.5.2 IsUnresolvableReference ( refRecord )

Soyut işlem IsUnresolvableReference, refRecord (bir Reference Record) argümanı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 refRecord.[[Base]] unresolvable ise, true döndür.

  2. false döndür.

6.2.5.3 IsSuperReference ( refRecord )

Soyut işlem IsSuperReference, refRecord (bir Reference Record) argümanı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 refRecord.[[ThisValue]] empty ise, false döndür.

  2. true döndür.

6.2.5.4 IsPrivateReference ( refRecord )

Soyut işlem IsPrivateReference, refRecord (bir Reference Record) argümanı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 refRecord.[[ReferencedName]] bir Private Name ise, true döndür.

  2. false döndür.

6.2.5.5 GetValue ( refRecord )

Soyut işlem GetValue, refRecord (bir Reference Record veya bir ECMAScript dil değeri) argümanını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir ani tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer refRecord bir Reference Record değilse, refRecord'u döndür.

  2. Eğer IsUnresolvableReference(refRecord) true ise, bir ReferenceError kuraldışı durumu fırlat.

  3. Eğer IsPropertyReference(refRecord) true ise,

    1. baseObj = ? ToObject(refRecord.[[Base]]) olsun.

    2. Eğer IsPrivateReference(refRecord) true ise,

      1. ? PrivateGet(baseObj, refRecord.[[ReferencedName]]) döndür.
    3. Eğer refRecord.[[ReferencedName]] bir özellik anahtarı değilse,

      1. refRecord.[[ReferencedName]]'i ? ToPropertyKey(refRecord.[[ReferencedName]]) olarak ayarla.
    4. ? baseObj.[[Get]](refRecord.[[ReferencedName]], GetThisValue(refRecord)) döndür.

  4. base = refRecord.[[Base]] olsun.

  5. Assert: base bir Environment Record'dır.

  6. ? base.GetBindingValue(refRecord.[[ReferencedName]], refRecord.[[Strict]]) döndür (bkz. 9.1).

6.2.5.6 PutValue ( refRecord, value )

Soyut işlem PutValue, refRecord (bir Reference Record veya bir ECMAScript dil değeri) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir ani tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer refRecord bir Reference Record değilse, bir ReferenceError kuraldışı durumu fırlat.

  2. Eğer IsUnresolvableReference(refRecord) true ise,

    1. Eğer refRecord.[[Strict]] true ise, bir ReferenceError kuraldışı durumu fırlat.

    2. globalObj = GetGlobalObject() olsun.

    3. ? Set(globalObj, refRecord.[[ReferencedName]], value, false) işlemini gerçekleştir.

    4. unused döndür.

  3. Eğer IsPropertyReference(refRecord) true ise,

    1. baseObj = ? ToObject(refRecord.[[Base]]) olsun.

    2. Eğer IsPrivateReference(refRecord) true ise,

      1. ? PrivateSet(baseObj, refRecord.[[ReferencedName]], value) döndür.
    3. Eğer refRecord.[[ReferencedName]] bir özellik anahtarı değilse,

      1. refRecord.[[ReferencedName]]'i ? ToPropertyKey(refRecord.[[ReferencedName]]) olarak ayarla.
    4. succeeded = ? baseObj.[[Set]](refRecord.[[ReferencedName]], value, GetThisValue(refRecord)) olsun.

    5. Eğer succeeded false ise ve refRecord.[[Strict]] true ise, bir TypeError kuraldışı durumu fırlat.

    6. unused döndür.

  4. base = refRecord.[[Base]] olsun.

  5. Assert: base bir Environment Record'dır.

  6. ? base.SetMutableBinding(refRecord.[[ReferencedName]], value, refRecord.[[Strict]]) döndür (bkz. 9.1).

6.2.5.7 GetThisValue ( refRecord )

Soyut işlem GetThisValue, refRecord (bir Reference Record) argümanını alır ve bir ECMAScript dil değeri döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsPropertyReference(refRecord) true'dur.

  2. Eğer IsSuperReference(refRecord) true ise, refRecord.[[ThisValue]] döndür.

  3. refRecord.[[Base]] döndür.

6.2.5.8 InitializeReferencedBinding ( refRecord, value )

Soyut işlem InitializeReferencedBinding, refRecord (bir Reference Record) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir ani tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsUnresolvableReference(refRecord) false'dır.

  2. base = refRecord.[[Base]] olsun.

  3. Assert: base bir Environment Record'dır.

  4. ? base.InitializeBinding(refRecord.[[ReferencedName]], value) döndür.

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

Soyut işlem MakePrivateReference, baseValue (bir ECMAScript dil değeri) ve privateIdentifier (bir String) argümanlarını alır ve bir Reference Record döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. privateEnv, çalışan yürütme bağlamının PrivateEnvironment'ı olsun.

  2. Assert: privateEnv null değildir.

  3. privateName = ResolvePrivateIdentifier(privateEnv, privateIdentifier) olsun.

  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty } döndür.

6.2.6 Property Descriptor Belirtim Türü

Property Descriptor türü, Object özelliği niteliklerinin işlenmesini ve şeyleştirilmesini açıklamak için kullanılır. Bir Property Descriptor, her alanın adının bir nitelik adı ve değerinin 6.1.7.1'de belirtilen karşılık gelen bir nitelik değeri olduğu, sıfır veya daha fazla alanı olan bir Record'dır. Bu belirtim içerisinde Property Descriptor record'larının değişmez açıklamalarını etiketlemek için kullanılan şema adı “PropertyDescriptor”dır.

Property Descriptor değerleri, belirli alanların varlığına veya kullanımına bağlı olarak, veri Property Descriptor'ları ve erişimci Property Descriptor'ları olarak daha da sınıflandırılabilir. Bir veri Property Descriptor'ı, [[Value]] veya [[Writable]] adlı alanlardan herhangi birini içerendir. Bir erişimci Property Descriptor'ı, [[Get]] veya [[Set]] adlı alanlardan herhangi birini içerendir. Herhangi bir Property Descriptor, [[Enumerable]] ve [[Configurable]] adlı alanlara sahip olabilir. Bir Property Descriptor değeri, hem bir veri Property Descriptor'ı hem de bir erişimci Property Descriptor'ı olamaz; ancak, ikisi de olmayabilir (bu durumda genel bir Property Descriptor'dır). Tam olarak doldurulmuş bir Property Descriptor, ya bir erişimci Property Descriptor'ı ya da bir veri Property Descriptor'ı olan ve Tablo 3'te tanımlanan karşılık gelen alanların tümüne sahip olandır.

Aşağıdaki soyut işlemler, bu belirtimde Property Descriptor değerleri üzerinde işlem yapmak için kullanılır:

6.2.6.1 IsAccessorDescriptor ( propertyDesc )

Soyut işlem IsAccessorDescriptor, propertyDesc (bir Property Descriptor) argümanı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 propertyDesc'in bir [[Get]] alanı varsa, true döndür.

  2. Eğer propertyDesc'in bir [[Set]] alanı varsa, true döndür.

  3. false döndür.

6.2.6.2 IsDataDescriptor ( propertyDesc )

Soyut işlem IsDataDescriptor, propertyDesc (bir Property Descriptor) argümanı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 propertyDesc'in bir [[Value]] alanı varsa, true döndür.

  2. Eğer propertyDesc'in bir [[Writable]] alanı varsa, true döndür.

  3. false döndür.

6.2.6.3 IsGenericDescriptor ( propertyDesc )

Soyut işlem IsGenericDescriptor, propertyDesc (bir Property Descriptor) argümanı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 IsAccessorDescriptor(propertyDesc) true ise, false döndür.

  2. Eğer IsDataDescriptor(propertyDesc) true ise, false döndür.

  3. true döndür.

6.2.6.4 FromPropertyDescriptor ( propertyDesc )

Soyut işlem FromPropertyDescriptor, propertyDesc (bir Property Descriptor veya undefined) argümanını alır ve bir Object veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer propertyDesc undefined ise, undefined döndür.

  2. obj = OrdinaryObjectCreate(%Object.prototype%) olsun.

  3. Assert: obj, kendi özelliği olmayan genişletilebilir bir sıradan nesnedir.

  4. Eğer propertyDesc'in bir [[Value]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "value", propertyDesc.[[Value]]) işlemini gerçekleştir.
  5. Eğer propertyDesc'in bir [[Writable]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "writable", propertyDesc.[[Writable]]) işlemini gerçekleştir.
  6. Eğer propertyDesc'in bir [[Get]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "get", propertyDesc.[[Get]]) işlemini gerçekleştir.
  7. Eğer propertyDesc'in bir [[Set]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "set", propertyDesc.[[Set]]) işlemini gerçekleştir.
  8. Eğer propertyDesc'in bir [[Enumerable]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "enumerable", propertyDesc.[[Enumerable]]) işlemini gerçekleştir.
  9. Eğer propertyDesc'in bir [[Configurable]] alanı varsa,

    1. ! CreateDataPropertyOrThrow(obj, "configurable", propertyDesc.[[Configurable]]) işlemini gerçekleştir.
  10. obj döndür.

6.2.6.5 ToPropertyDescriptor ( obj )

Soyut işlem ToPropertyDescriptor, obj (bir ECMAScript dil değeri) argümanını alır ve ya bir Property Descriptor içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj bir Object değilse, bir TypeError kuraldışı durumu fırlat.

  2. propertyDesc, başlangıçta hiçbir alanı olmayan yeni bir Property Descriptor olsun.

  3. hasEnumerable = ? HasProperty(obj, "enumerable") olsun.

  4. Eğer hasEnumerable true ise,

    1. enumerable = ToBoolean(? Get(obj, "enumerable")) olsun.

    2. propertyDesc.[[Enumerable]]'i enumerable olarak ayarla.

  5. hasConfigurable = ? HasProperty(obj, "configurable") olsun.

  6. Eğer hasConfigurable true ise,

    1. configurable = ToBoolean(? Get(obj, "configurable")) olsun.

    2. propertyDesc.[[Configurable]]configurable olarak ayarla.

  7. hasValue = ? HasProperty(obj, "value") olsun.

  8. Eğer hasValue true ise,

    1. value = ? Get(obj, "value") olsun.

    2. propertyDesc.[[Value]]value olarak ayarla.

  9. hasWritable = ? HasProperty(obj, "writable") olsun.

  10. Eğer hasWritable true ise,

    1. writable = ToBoolean(? Get(obj, "writable")) olsun.

    2. propertyDesc.[[Writable]]writable olarak ayarla.

  11. hasGet = ? HasProperty(obj, "get") olsun.

  12. Eğer hasGet true ise,

    1. getter = ? Get(obj, "get") olsun.

    2. Eğer IsCallable(getter) false ise ve getter undefined değilse, bir TypeError kuraldışı durumu fırlat.

    3. propertyDesc.[[Get]]'i getter olarak ayarla.

  13. hasSet = ? HasProperty(obj, "set") olsun.

  14. Eğer hasSet true ise,

    1. setter = ? Get(obj, "set") olsun.

    2. Eğer IsCallable(setter) false ise ve setter undefined değilse, bir TypeError kuraldışı durumu fırlat.

    3. propertyDesc.[[Set]]'i setter olarak ayarla.

  15. Eğer propertyDesc'in bir [[Get]] alanı varsa veya propertyDesc'in bir [[Set]] alanı varsa,

    1. Eğer propertyDesc'in bir [[Value]] alanı varsa veya propertyDesc'in bir [[Writable]] alanı varsa, bir TypeError kuraldışı durumu fırlat.
  16. propertyDesc döndür.

6.2.6.6 CompletePropertyDescriptor ( propertyDesc )

Soyut işlem CompletePropertyDescriptor, propertyDesc (bir Property Descriptor) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. like, Record { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false } olsun.

  2. Eğer IsGenericDescriptor(propertyDesc) true ise veya IsDataDescriptor(propertyDesc) true ise,

    1. Eğer propertyDesc'in bir [[Value]] alanı yoksa, propertyDesc.[[Value]]like.[[Value]] olarak ayarla.

    2. Eğer propertyDesc'in bir [[Writable]] alanı yoksa, propertyDesc.[[Writable]]like.[[Writable]] olarak ayarla.

  3. Değilse,

    1. Eğer propertyDesc'in bir [[Get]] alanı yoksa, propertyDesc.[[Get]]'i like.[[Get]] olarak ayarla.

    2. Eğer propertyDesc'in bir [[Set]] alanı yoksa, propertyDesc.[[Set]]'i like.[[Set]] olarak ayarla.

  4. Eğer propertyDesc'in bir [[Enumerable]] alanı yoksa, propertyDesc.[[Enumerable]]'i like.[[Enumerable]] olarak ayarla.

  5. Eğer propertyDesc'in bir [[Configurable]] alanı yoksa, propertyDesc.[[Configurable]]like.[[Configurable]] olarak ayarla.

  6. unused döndür.

6.2.7 Environment Record Belirtim Türü

Environment Record türü, iç içe işlevlerde ve bloklarda ad çözümlemenin davranışını açıklamak için kullanılır. Bu tür ve üzerindeki işlemler 9.1'de tanımlanmıştır.

6.2.8 Abstract Closure Belirtim Türü

Abstract Closure belirtim türü, bir değerler topluluğu ile birlikte algoritma adımlarına atıfta bulunmak için kullanılır. Abstract Closure'lar üst-değerlerdir ve closure(arg1, arg2) gibi işlev uygulama biçemi kullanılarak çağrılırlar. Soyut işlemler gibi, çağrılar da Abstract Closure tarafından tanımlanan algoritma adımlarını gerçekleştirir.

Bir Abstract Closure oluşturan algoritma adımlarında, değerler “capture” eylemi ve ardından bir takma ad listesi ile yakalanır. Bir Abstract Closure oluşturulduğunda, o anda her takma adla ilişkili değeri yakalar. Bir Abstract Closure çağrıldığında gerçekleştirilecek algoritmayı belirten adımlarda, yakalanan her değere, değeri yakalamak için kullanılan takma ad ile atıfta bulunulur.

Eğer bir Abstract Closure bir Completion Record döndürürse, bu Completion Record ya bir normal tamamlanma ya da bir throw tamamlanması olmak zorundadır.

Abstract Closure'lar, aşağıdaki örnekte gösterildiği gibi, diğer algoritmaların bir parçası olarak satır içinde oluşturulur.

  1. addend 41 olsun.

  2. closure, addend'i yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, (x) parametreli yeni bir Abstract Closure olsun:

    1. x + addend döndür.
  3. value = closure(1) olsun.

  4. Assert: value 42'dir.

6.2.9 Veri Blokları

Data Block belirtim türü, bayt boyutlu (8 bit) sayısal değerlerin farklı ve değişebilir bir dizisini tanımlamak için kullanılır. Bir bayt değeri, 0 ile 255 dahil aralığında bir tamsayıdır. Bir Data Block değeri, her biri başlangıç değeri 0 olan sabit sayıda baytla oluşturulur.

Bu belirtim içerisinde gösterim kolaylığı için, bir Data Block değerinin bireysel baytlarına erişmek üzere dizi benzeri bir sözdizimi kullanılabilir. Bu gösterim, bir Data Block değerini, 0 tabanlı tamsayı indisli bir bayt dizisi olarak sunar. Örneğin, eğer db 5 baytlık bir Data Block değeri ise, db[2] onun 3üncü baytına erişmek için kullanılabilir.

Birden fazla etmen tarafından eşzamanlı olarak başvurulabilen bellekte yer alan bir veri bloğu, Paylaşımlı Veri Bloğu olarak adlandırılır. Bir Paylaşımlı Veri Bloğu, (Paylaşımlı Veri Bloğu değerlerinin eşitlik sınaması amacıyla) adresten bağımsız bir kimliğe sahiptir: bu, bloğun herhangi bir süreçte eşlendiği sanal adreslere değil, bloğun temsil ettiği bellekteki konumlar kümesine bağlıdır. İki veri bloğu, yalnızca içerdikleri konumların kümeleri eşitse eşittir; aksi takdirde eşit değildirler ve içerdikleri konum kümelerinin kesişimi boştur. Son olarak, Paylaşımlı Veri Blokları, Veri Bloklarından ayırt edilebilir.

Paylaşımlı Veri Bloklarının anlambilimi, bellek modeli tarafından Paylaşımlı Veri Bloğu olayları kullanılarak tanımlanır. Aşağıdaki soyut işlemler, Paylaşımlı Veri Bloğu olaylarını tanıtır ve değerlendirme anlambilimi ile bellek modelinin olay anlambilimi arasındaki arayüz görevi görür. Olaylar, bellek modelinin bir süzgeç olarak etki ettiği bir aday yürütme oluşturur. Tam anlambilim için lütfen bellek modeline başvurun.

Paylaşımlı Veri Bloğu olayları, bellek modelinde tanımlanan Record'lar ile modellenir.

Aşağıdaki soyut işlemler, bu belirtimde Data Block değerleri üzerinde işlem yapmak için kullanılır:

6.2.9.1 CreateByteDataBlock ( size )

Soyut işlem CreateByteDataBlock, size (negatif olmayan bir tamsayı) argümanını alır ve ya bir Data Block içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer size > 253 - 1 ise, bir RangeError kuraldışı durumu fırlat.

  2. db, size bayttan oluşan yeni bir Data Block değeri olsun. Eğer böyle bir Data Block oluşturmak olanaksızsa, bir RangeError kuraldışı durumu fırlat.

  3. db'nin tüm baytlarını 0 olarak ayarla.

  4. db döndür.

6.2.9.2 CreateSharedByteDataBlock ( size )

Soyut işlem CreateSharedByteDataBlock, size (negatif olmayan bir tamsayı) argümanını alır ve ya bir Shared Data Block içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. db, size bayttan oluşan yeni bir Shared Data Block değeri olsun. Eğer böyle bir Shared Data Block oluşturmak olanaksızsa, bir RangeError kuraldışı durumu fırlat.

  2. agentRecord, çevreleyen etmenin Agent Record'ı olsun.

  3. execution = agentRecord.[[CandidateExecution]] olsun.

  4. eventsRecord, [[AgentSignifier]] değeri AgentSignifier() olan execution.[[EventsRecords]]'ın Agent Events Record'ı olsun.

  5. zero = « 0 » olsun.

  6. db'nin her index indisi için,

    1. eventsRecord.[[EventList]]'e WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: index, [[ElementSize]]: 1, [[Payload]]: zero } ekle.
  7. db döndür.

6.2.9.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

Soyut işlem CopyDataBlockBytes, toBlock (bir Data Block veya bir Shared Data Block), toIndex (negatif olmayan bir tamsayı), fromBlock (bir Data Block veya bir Shared Data Block), fromIndex (negatif olmayan bir tamsayı) ve count (negatif olmayan bir tamsayı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: fromBlock ve toBlock farklı değerlerdir.

  2. fromSize, fromBlock'taki bayt sayısı olsun.

  3. Assert: fromIndex + countfromSize.

  4. toSize, toBlock'taki bayt sayısı olsun.

  5. Assert: toIndex + counttoSize.

  6. count > 0 olduğu sürece tekrar et,

    1. Eğer fromBlock bir Shared Data Block ise,

      1. agentRecord, çevreleyen etmenin Agent Record'ı olsun.

      2. execution = agentRecord.[[CandidateExecution]] olsun.

      3. eventsRecord, [[AgentSignifier]] değeri AgentSignifier() olan execution.[[EventsRecords]]'ın Agent Events Record'ı olsun.

      4. bytes, yegane öğesi, belirlenimci olmayan bir şekilde seçilmiş bir bayt değeri olan bir Liste olsun.

      5. NOTE: Gerçekleştirimlerde, bytes, altta yatan donanım üzerindeki atomik olmayan bir okuma talimatının sonucudur. Belirlenimsizlik, zayıf tutarlılığa sahip donanımın gözlemlenebilir davranışını tanımlamak için bellek modelinin anlambilimsel bir reçetesidir.

      6. readEvent, ReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 } olsun.

      7. eventsRecord.[[EventList]]'e readEvent'i ekle.

      8. execution.[[ChosenValues]]'a Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes } ekle.

      9. Eğer toBlock bir Shared Data Block ise,

         1. *eventsRecord*.*[[EventList]]*'e [WriteSharedMemory](30_sec-memory-model.md#sec-memory-model-fundamentals) { *[[Order]]*: `unordered`, *[[NoTear]]*: `true`, *[[Block]]*: *toBlock*, *[[ByteIndex]]*: *toIndex*, *[[ElementSize]]*: 1, *[[Payload]]*: *bytes* } ekle.
      10. Değilse,

        1. *toBlock*[*toIndex*]'i *bytes*[0] olarak ayarla.
    2. Değilse,

      1. Assert: toBlock bir Shared Data Block değildir.

      2. toBlock[toIndex]'i fromBlock[fromIndex] olarak ayarla.

    3. toIndex = toIndex + 1 olarak ayarla.

    4. fromIndex = fromIndex + 1 olarak ayarla.

    5. count = count - 1 olarak ayarla.

  7. unused döndür.

6.2.10 PrivateElement Belirtim Türü

PrivateElement türü, özel sınıf alanları, yöntemleri ve erişimcilerinin belirtiminde kullanılan bir Record'dır. Özel öğeler için Property Descriptor'ları kullanılmamakla birlikte, özel alanlar yapılandırılamaz, numaralandırılamaz, yazılabilir veri özelliklerine benzer davranır; özel yöntemler yapılandırılamaz, numaralandırılamaz, yazılamaz veri özelliklerine benzer davranır ve özel erişimciler yapılandırılamaz, numaralandırılamaz erişimci özelliklerine benzer davranır.

PrivateElement türünün değerleri, alanları Tablo 9 ile tanımlanan Record değerleridir. Bu tür değerler PrivateElement'ler olarak anılır.

Tablo 9: PrivateElement Alanları

Alan Adı Bulunduğu [[Kind]] alanının değerleri Değer Anlamı
[[Key]] Tümü bir Private Name Alanın, yöntemin veya erişimcinin adı.
[[Kind]] Tümü field, method veya accessor Öğenin türü.
[[Value]] field ve method bir ECMAScript dil değeri Alanın değeri.
[[Get]] accessor bir işlev nesnesi veya undefined Özel erişimci için getter.
[[Set]] accessor bir işlev nesnesi veya undefined Özel erişimci için setter.

6.2.11 ClassFieldDefinition Record Belirtim Türü

ClassFieldDefinition türü, sınıf alanlarının belirtiminde kullanılan bir Record'dır.

ClassFieldDefinition türünün değerleri, alanları Tablo 10 ile tanımlanan Record değerleridir. Bu tür değerler ClassFieldDefinition Record'ları olarak anılır.

Tablo 10: ClassFieldDefinition Record Alanları

Alan Adı Değer Anlamı
[[Name]] bir Private Name, bir String veya bir Symbol Alanın adı.
[[Initializer]] bir ECMAScript işlev nesnesi veya empty Alanın ilklendiricisi, varsa.

6.2.12 Özel Adlar

Private Name belirtim türü, özel bir sınıf öğesinin (alan, yöntem veya erişimci) anahtarını temsil eden küresel olarak benzersiz bir değeri (başka herhangi bir Private Name'den, aksi takdirde ayırt edilemez olsalar bile, farklı olan) tanımlamak için kullanılır. Her Private Name, bir String olan değiştirilemez bir [[Description]] iç yuvasına sahiptir. Bir Private Name, herhangi bir ECMAScript nesnesine PrivateFieldAdd veya PrivateMethodOrAccessorAdd ile yüklenebilir ve daha sonra PrivateGet ve PrivateSet kullanılarak okunabilir veya yazılabilir.

6.2.13 ClassStaticBlockDefinition Record Belirtim Türü

Bir ClassStaticBlockDefinition Record, bir sınıf statik ilklendirme bloğu için yürütülebilir kodu kapsüllemek üzere kullanılan bir Record değeridir.

ClassStaticBlockDefinition Record'ları, Tablo 11'de listelenen alanlara sahiptir.

Tablo 11: ClassStaticBlockDefinition Record Alanları

Alan Adı Değer Anlamı
[[BodyFunction]] bir ECMAScript işlev nesnesi Bir sınıfın statik ilklendirilmesi sırasında çağrılacak işlev nesnesi.