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

Genel Bakış

Bu bölüm, ECMAScript diline ilişkin normatif olmayan bir genel bakış içermektedir.

ECMAScript, bir konak ortamı içerisinde hesaplamalar gerçekleştirmek ve hesaplama nesnelerini işlemek için kullanılan nesne yönelimli bir programlama dilidir. Burada tanımlandığı biçimiyle ECMAScript'in hesaplama açısından kendi kendine yeterli olması amaçlanmamıştır; gerçekten de, bu belirtimde dış veri girişi veya hesaplanan sonuçların çıkışı için hiçbir hüküm bulunmamaktadır. Bunun yerine, bir ECMAScript programının hesaplama ortamının, yalnızca bu belirtimde açıklanan nesneleri ve diğer olanakları değil, aynı zamanda belirli ortama özgü nesneleri de sağlaması beklenir; bu nesnelerin açıklaması ve davranışı, bir ECMAScript programından erişilebilecek belirli özellikleri ve çağrılabilecek belirli işlevleri sağlayabileceklerini belirtmek dışında, bu belirtimin kapsamı dışındadır.

ECMAScript başlangıçta bir betik dili olarak kullanılmak üzere tasarlanmış, ancak genel amaçlı bir programlama dili olarak yaygın biçimde kullanılır hale gelmiştir. Bir betik dili, mevcut bir sistemin olanaklarını işlemek, özelleştirmek ve otomatikleştirmek için kullanılan bir programlama dilidir. Bu tür sistemlerde, yararlı işlevsellik bir kullanıcı arayüzü aracılığıyla zaten mevcuttur ve betik dili, bu işlevselliği program denetimine açmak için bir mekanizmadır. Bu biçimde, mevcut sistemin, betik dilinin yeteneklerini tamamlayan bir nesneler ve olanaklar konak ortamı sağladığı söylenir. Bir betik dili, hem profesyonel hem de profesyonel olmayan programcılar tarafından kullanılmak üzere tasarlanmıştır.

ECMAScript başlangıçta, tarayıcılardaki Web sayfalarını canlandırmak ve Web tabanlı istemci-sunucu mimarisinin bir parçası olarak sunucu hesaplaması gerçekleştirmek için bir mekanizma sağlayan bir Web betik dili olarak tasarlanmıştır. ECMAScript artık çeşitli konak ortamları için çekirdek betikleme yetenekleri sağlamak üzere kullanılmaktadır. Bu nedenle çekirdek dil, herhangi bir belirli konak ortamından ayrı olarak bu belgede belirtilmiştir.

ECMAScript kullanımı basit betiklemenin ötesine geçmiş olup, günümüzde birçok farklı ortam ve ölçekte tüm programlama görevleri yelpazesi için kullanılmaktadır. ECMAScript'in kullanımı genişledikçe, sağladığı özellikler ve olanaklar da genişlemiştir. ECMAScript artık tam özellikli, genel amaçlı bir programlama dilidir.

4.1 Web Betikleme

Bir web tarayıcısı, örneğin pencereleri, menüleri, açılır pencereleri, iletişim kutularını, metin alanlarını, çapaları, çerçeveleri, geçmişi, çerezleri ve girdi/çıktıyı temsil eden nesneler dahil olmak üzere, istemci tarafı hesaplama için bir ECMAScript konak ortamı sağlar. Ayrıca, konak ortamı, odak değişimi, sayfa ve resim yükleme, boşaltma, hata ve iptal, seçim, form gönderme ve fare eylemleri gibi olaylara betik kodu bağlama aracı sağlar. Betik kodu HTML içerisinde yer alır ve görüntülenen sayfa, kullanıcı arayüz öğeleri ile sabit ve hesaplanan metin ve resimlerin bir birleşimidir. Betik kodu kullanıcı etkileşimine tepkilidir ve bir ana programa gerek yoktur.

Bir web sunucusu, istekleri, istemcileri ve dosyaları temsil eden nesneler ile verileri kilitleme ve paylaşma mekanizmalarını içeren, sunucu tarafı hesaplama için farklı bir konak ortamı sağlar. Tarayıcı tarafı ve sunucu tarafı betiklemeyi birlikte kullanarak, Web tabanlı bir uygulama için özelleştirilmiş bir kullanıcı arayüzü sağlarken, hesaplamayı istemci ve sunucu arasında dağıtmak mümkündür.

ECMAScript'i destekleyen her Web tarayıcısı ve sunucusu, ECMAScript yürütme ortamını tamamlayan kendi konak ortamını sağlar.

4.2 Konaklar ve Gerçekleştirimler

ECMAScript'in konak ortamlarına entegrasyonuna yardımcı olmak için, bu belirtim, belirli olanakların (örneğin, soyut işlemler) tanımını, bütünüyle veya kısmen, bu belirtimin dışındaki bir kaynağa erteler. Yazımsal olarak, bu belirtim aşağıdaki erteleme türlerini ayırt eder.

Bir gerçekleştirim, Ek D'de sıralanan veya gerçekleştirim tanımlı ya da gerçekleştirim yaklaşık olarak işaretlenen olanakları daha ayrıntılı tanımlayan dış bir kaynaktır. Gayriresmî kullanımda, bir gerçekleştirim, belirli bir web tarayıcısı gibi somut bir ürünü ifade eder.

Gerçekleştirim tanımlı bir olanak, tanımını ek bir niteleme olmaksızın dış bir kaynağa erteleyen olanaktır. Bu belirtim, belirli davranışlar için herhangi bir tavsiyede bulunmaz ve uygun gerçekleştirimler, bu belirtimin ortaya koyduğu kısıtlamalar dahilinde herhangi bir davranışı seçmekte serbesttir.

Gerçekleştirim yaklaşık bir olanak, ideal bir davranış tavsiye ederken tanımını dış bir kaynağa erteleyen olanaktır. Uygun gerçekleştirimler, bu belirtimin ortaya koyduğu kısıtlamalar dahilinde herhangi bir davranışı seçmekte serbest olsalar da, ideale yaklaşmaya gayret etmeleri teşvik edilir. Math.exp gibi bazı matematiksel işlemler gerçekleştirim yaklaşık niteliktedir.

Bir konak, Ek D'de listelenen olanakları daha ayrıntılı tanımlayan, ancak diğer gerçekleştirim tanımlı veya gerçekleştirim yaklaşık olanakları daha ayrıntılı tanımlamayan dış bir kaynaktır. Gayriresmî kullanımda, bir konak, bu belirtimle Ek D aracılığıyla aynı biçimde arayüz oluşturan tüm gerçekleştirimlerin kümesini, örneğin tüm web tarayıcılarının kümesini ifade eder. Bir konak genellikle WHATWG HTML (https://html.spec.whatwg.org/) gibi harici bir belirtimdir. Başka bir deyişle, konak tanımlı olanaklar genellikle harici belirtimlerde daha ayrıntılı olarak tanımlanır.

Bir konak kancası, bütünüyle veya kısmen dış bir kaynak tarafından tanımlanan soyut bir işlemdir. Tüm konak kancaları Ek D'de listelenmelidir. Bir konak kancası en azından aşağıdaki gerekliliklere uymak zorundadır:

Konak tanımlı bir olanak, tanımını ek bir niteleme olmaksızın dış bir kaynağa erteleyen ve Ek D'de listelenen olanaktır. Konak olmayan gerçekleştirimler de konak tanımlı olanaklar için tanımlar sağlayabilir.

Bir konak ortamı, tüm konak tanımlı olanaklar için yapılan belirli bir tanım seçimidir. Bir konak ortamı tipik olarak, küresel nesnenin konak tanımlı özellikleri olarak girdi almayı ve çıktı sağlamayı mümkün kılan nesneleri veya işlevleri içerir.

Bu belirtim, her zaman en özgül terimi kullanma yazımsal kuralını izler. Örneğin, bir olanak konak tanımlı ise, ona gerçekleştirim tanımlı olarak atıfta bulunulmamalıdır.

Hem konaklar hem de gerçekleştirimler, burada tanımlanan dil türleri, belirtim türleri, soyut işlemler, dilbilgisi üretimleri, içkin nesneler ve içkin semboller aracılığıyla bu belirtimle arayüz oluşturabilir.

4.3 ECMAScript Genel Bakışı

Aşağıda, ECMAScript'in gayriresmî bir genel bakışı yer almaktadır—dilin tüm bölümleri açıklanmamaktadır. Bu genel bakış, asıl standardın bir parçası değildir.

ECMAScript nesne tabanlıdır: temel dil ve konak olanakları nesneler tarafından sağlanır ve bir ECMAScript programı, iletişim kuran nesnelerin bir kümesidir. ECMAScript'te bir nesne, her biri, her bir özelliğin nasıl kullanılabileceğini belirleyen nitelikler taşıyan sıfır veya daha fazla özellik topluluğudur—örneğin, bir özelliğin Yazılabilir niteliği false olarak ayarlandığında, çalıştırılan ECMAScript kodunun özelliğe farklı bir değer atamaya yönelik herhangi bir girişimi başarısız olur. Özellikler, diğer nesneleri, ilkel değerleri veya işlevleri tutan kaplardır. Bir ilkel değer, şu yerleşik türlerden birinin üyesidir: Undefined, Null, Boolean, Number, BigInt, String ve Symbol; bir nesne, Object yerleşik türünün üyesidir; ve bir işlev, çağrılabilir bir nesnedir. Bir nesne ile bir özellik aracılığıyla ilişkilendirilmiş işleve yöntem denir.

ECMAScript, ECMAScript varlıklarının tanımını tamamlayan bir yerleşik nesneler topluluğu tanımlar. Bu yerleşik nesneler arasında küresel nesne; Object, Function, Boolean, Symbol ve çeşitli Error nesneleri dahil olmak üzere dilin çalışma zamanı anlambilimi için temel teşkil eden nesneler; Math, Number ve Date dahil olmak üzere sayısal değerleri temsil eden ve işleyen nesneler; metin işleme nesneleri String ve RegExp; öğelerinin tümü belirli bir sayısal veri temsiline sahip olan Array ve dokuz farklı Tipli Dizi türü dahil olmak üzere, değerlerin indisli koleksiyonları olan nesneler; Map ve Set nesneleri dahil olmak üzere anahtarlı koleksiyonlar; JSON nesnesi, ArrayBuffer, SharedArrayBuffer ve DataView dahil olmak üzere yapılandırılmış verileri destekleyen nesneler; üreteç işlevleri ve Promise nesneleri dahil olmak üzere denetim soyutlamalarını destekleyen nesneler; ve Proxy ile Reflect dahil olmak üzere yansıma nesneleri bulunur.

ECMAScript ayrıca bir dizi yerleşik işleç tanımlar. ECMAScript işleçleri arasında çeşitli tek terimli işlemler, çarpımsal işleçler, toplamsal işleçler, bitsel kaydırma işleçleri, ilişkisel işleçler, eşitlik işleçleri, ikili bitsel işleçler, ikili mantıksal işleçler, atama işleçleri ve virgül işleci bulunur.

Büyük ECMAScript programları, bir programın birden çok deyim ve bildirim dizisine bölünmesine olanak tanıyan modüller tarafından desteklenir. Her modül, diğer modüller tarafından sağlanması gereken, kullandığı bildirimleri ve kendi bildirimlerinden hangilerinin diğer modüller tarafından kullanıma açık olduğunu açıkça tanımlar.

ECMAScript sözdizimi bilinçli olarak Java sözdizimine benzer. ECMAScript sözdizimi, kullanımı kolay bir betik dili olarak hizmet etmesini sağlamak için gevşetilmiştir. Örneğin, bir değişkenin türünün bildirilmesi gerekmez, türler özelliklerle ilişkilendirilmez ve tanımlanan işlevlerin bildirimlerinin, onlara yapılan çağrılardan metinsel olarak önce görünmesi gerekmez.

4.3.1 Nesneler

ECMAScript sınıf tanımları için sözdizimi içermesine karşın, ECMAScript nesneleri temel olarak C++, Smalltalk veya Java'dakiler gibi sınıf tabanlı değildir. Bunun yerine nesneler, değişmez gösterim yoluyla veya nesneleri oluşturan ve ardından başlangıç değerlerini özelliklerine atayarak onların tamamını veya bir kısmını ilklendiren kodu çalıştıran oluşturucular aracılığıyla olmak üzere çeşitli yollarla oluşturulabilir. Her oluşturucu, prototip tabanlı kalıtımı ve paylaşımlı özellikleri gerçekleştirmek için kullanılan "prototype" adlı bir özelliğe sahip olan bir işlevdir. Nesneler new ifadelerinde oluşturucular kullanılarak oluşturulur; örneğin, new Date(2009, 11) yeni bir Date nesnesi oluşturur. Bir oluşturucuyu new kullanmadan çağırmanın, oluşturucuya bağlı sonuçları olur. Örneğin, Date() bir nesne yerine geçerli tarih ve saatin bir dizgi temsilini üretir.

Bir oluşturucu tarafından oluşturulan her nesne, oluşturucusunun "prototype" özelliğinin değerine örtük bir başvuru (nesnenin prototipi olarak adlandırılır) taşır. Dahası, bir prototip kendi prototipine null olmayan bir örtük başvuru taşıyabilir ve bu böyle devam eder; buna prototip zinciri denir. Bir nesnede bir özelliğe başvuru yapıldığında, bu başvuru, prototip zincirinde o ada sahip bir özelliği içeren ilk nesnedeki o isimli özelliğe yapılır. Başka bir deyişle, önce doğrudan belirtilen nesne böyle bir özellik için incelenir; eğer o nesne adlandırılmış özelliği içeriyorsa, başvurunun işaret ettiği özellik budur; eğer o nesne adlandırılmış özelliği içermiyorsa, o nesnenin prototipi incelenir; ve bu böyle devam eder.

Şekil 1: Nesne/Prototip İlişkileri

Sınıf tabanlı nesne yönelimli bir dilde, genel olarak, durum örnekler tarafından taşınır, yöntemler sınıflar tarafından taşınır ve kalıtım yalnızca yapı ve davranışa ilişkindir. ECMAScript'te ise durum ve yöntemler nesneler tarafından taşınırken; yapı, davranış ve durumun tümü kalıtılır.

Prototiplerinin içerdiği belirli bir özelliği doğrudan içermeyen tüm nesneler, o özelliği ve değerini paylaşır. Şekil 1 bunu göstermektedir:

CF bir oluşturucudur (ve aynı zamanda bir nesnedir). new ifadeleri kullanılarak beş nesne oluşturulmuştur: cf1, cf2, cf3, cf4 ve cf5. Bu nesnelerin her biri "q1" ve "q2" adlı özellikler içerir. Kesikli çizgiler örtük prototip ilişkisini temsil eder; yani, örneğin, cf3'ün prototipi CFp'dir. Oluşturucu CF, "P1" ve "P2" adlı, CFp, cf1, cf2, cf3, cf4 veya cf5 tarafından görülemeyen iki özelliğe sahiptir. CFp içindeki "CFP1" adlı özellik, CFp'nin örtük prototip zincirinde bulunan ve "q1", "q2" veya "CFP1" adlandırılmamış diğer özellikler gibi, cf1, cf2, cf3, cf4 ve cf5 tarafından paylaşılır (ancak CF tarafından paylaşılmaz). CF ile CFp arasında hiçbir örtük prototip bağlantısı olmadığına dikkat edin.

Çoğu sınıf tabanlı nesne dilinin aksine, özellikler nesnelere değerler atanarak dinamik olarak eklenebilir. Yani, oluşturucuların oluşturulan nesnenin özelliklerinin tümünü veya herhangi birini adlandırması veya onlara değer ataması gerekmez. Yukarıdaki diyagramda, CFp içindeki özelliğe yeni bir değer atayarak cf1, cf2, cf3, cf4 ve cf5 için yeni bir paylaşımlı özellik eklenebilir.

ECMAScript nesneleri doğası gereği sınıf tabanlı olmasa da, oluşturucu işlevleri, prototip nesneleri ve yöntemlerden oluşan ortak bir desene dayalı sınıf benzeri soyutlamalar tanımlamak çoğu zaman uygundur. ECMAScript yerleşik nesnelerinin kendileri de böyle bir sınıf benzeri deseni izler. ECMAScript 2015'ten itibaren, ECMAScript dili, programcıların yerleşik nesneler tarafından kullanılan aynı sınıf benzeri soyutlama desenine uyan nesneleri öz bir biçimde tanımlamalarına olanak tanıyan sözdizimsel sınıf tanımları içerir.

4.3.2 ECMAScript'in Katı Türü

ECMAScript Dili, dilin bazı kullanıcılarının dilde mevcut olan bazı özelliklerin kullanımını kısıtlamak isteyebilecekleri olasılığını tanır. Bunu güvenlik amacıyla, hataya açık olduğunu düşündükleri özelliklerden kaçınmak, gelişmiş hata denetimi elde etmek veya kendi seçtikleri diğer nedenlerle yapabilirler. Bu olasılığı desteklemek üzere, ECMAScript dilin katı bir türünü tanımlar. Dilin katı türü, normal ECMAScript dilinin bazı belirli sözdizimsel ve anlambilimsel özelliklerini dışlar ve bazı özelliklerin ayrıntılı anlambilimini değiştirir. Katı tür ayrıca, dilin katı olmayan biçiminde hata olarak belirtilmeyen durumlarda hata kuraldışı durumları fırlatarak raporlanması gereken ek hata koşullarını belirtir.

ECMAScript'in katı türü yaygın olarak dilin katı kipi olarak anılır. Katı kip seçimi ve ECMAScript'in katı kip sözdizimi ve anlambiliminin kullanımı, 11.2.2'de açıklandığı gibi, bireysel ECMAScript kaynak metin birimleri düzeyinde açıkça yapılır. Katı kip, sözdizimsel bir kaynak metin birimi düzeyinde seçildiğinden, katı kip yalnızca böyle bir kaynak metin birimi içerisinde yerel etkiye sahip kısıtlamalar getirir. Katı kip, ECMAScript anlambiliminin birden çok kaynak metin birimi arasında tutarlı biçimde çalışması gereken herhangi bir yönünü kısıtlamaz veya değiştirmez. Tam bir ECMAScript programı, hem katı kip hem de katı olmayan kip ECMAScript kaynak metin birimlerinden oluşabilir. Bu durumda, katı kip yalnızca katı kip kaynak metin birimi içerisinde tanımlanmış kod fiilen yürütülürken uygulanır.

Bu belirtime uymak için, bir ECMAScript gerçekleştirimi, hem tam kısıtlamasız ECMAScript dilini hem de bu belirtim ile tanımlanan ECMAScript dilinin katı türünü gerçekleştirmelidir. Ek olarak, bir gerçekleştirim, kısıtlamasız ve katı kip kaynak metin birimlerinin tek bir bileşik programda birleştirilmesini desteklemelidir.

4.4 Terimler ve Tanımlar

Bu belgenin amaçları bakımından, aşağıdaki terimler ve tanımlar geçerlidir.

4.4.1 gerçekleştirim yaklaşık

bir gerçekleştirim yaklaşık olanak, bütünüyle veya kısmen dış bir kaynak tarafından tanımlanır ancak bu belirtimde tavsiye edilen, ideal bir davranışa sahiptir

4.4.2 gerçekleştirim tanımlı

bir gerçekleştirim tanımlı olanak, bütünüyle veya kısmen bu belirtimin dışındaki bir kaynak tarafından tanımlanır

4.4.3 konak tanımlı

gerçekleştirim tanımlı ile aynıdır

4.4.4 tür

madde 6'da tanımlanan veri değerleri kümesi

4.4.5 ilkel değer

madde 6'da tanımlanan Undefined, Null, Boolean, Number, BigInt, Symbol veya String türlerinden birinin üyesi

4.4.6 nesne

Object türünün üyesi

4.4.7 oluşturucu

nesneleri oluşturan ve ilklendiren işlev nesnesi

4.4.8 prototip

diğer nesneler için paylaşımlı özellikler sağlayan nesne

4.4.9 sıradan nesne

tüm nesneler tarafından desteklenmesi gereken temel iç yöntemler için varsayılan davranışa sahip olan nesne

4.4.10 egzotik nesne

temel iç yöntemlerin bir veya daha fazlası için varsayılan davranışa sahip olmayan nesne

4.4.11 standart nesne

anlambilimi bu belirtim tarafından tanımlanan nesne

4.4.12 yerleşik nesne

bir ECMAScript gerçekleştirimi tarafından belirtilen ve sağlanan nesne

4.4.13 undefined değeri

bir değişkene değer atanmamış olduğunda kullanılan ilkel değer

4.4.14 Undefined türü

tek değeri undefined değeri olan tür

4.4.15 null değeri

herhangi bir nesne değerinin kasıtlı yokluğunu temsil eden ilkel değer

4.4.16 Null türü

tek değeri null değeri olan tür

4.4.17 Boolean değeri

Boolean türünün üyesi

4.4.18 Boolean türü

true ve false ilkel değerlerinden oluşan tür

4.4.19 Boolean nesnesi

standart yerleşik Boolean oluşturucusunun bir örneği olan Object türü üyesi

4.4.20 String değeri

sıfır veya daha fazla 16 bitlik işaretsiz tamsayı değerinden oluşan sonlu, sıralı bir dizi olan ilkel değer

4.4.21 String türü

olası tüm String değerlerinin kümesi

4.4.22 String nesnesi

standart yerleşik String oluşturucusunun bir örneği olan Object türü üyesi

4.4.23 Number değeri

çift duyarlıklı 64 bit ikili biçimli IEEE 754-2019 değerine karşılık gelen ilkel değer

4.4.24 Number türü

NaN (“sayı değil”), +∞𝔽 (artı sonsuz) ve -∞𝔽 (eksi sonsuz) dahil olmak üzere olası tüm Number değerlerinin kümesi

4.4.25 Number nesnesi

standart yerleşik Number oluşturucusunun bir örneği olan Object türü üyesi

4.4.26 Infinity

pozitif sonsuz Number değeri olan Number değeri

4.4.27 NaN

IEEE 754-2019 NaN (“sayı değil”) değeri olan Number değeri

4.4.28 BigInt değeri

keyfi duyarlıklı bir tamsayı değerine karşılık gelen ilkel değer

4.4.29 BigInt türü

olası tüm BigInt değerlerinin kümesi

4.4.30 BigInt nesnesi

standart yerleşik BigInt oluşturucusunun bir örneği olan Object türü üyesi

4.4.31 Symbol değeri

benzersiz, String olmayan bir Object özellik anahtarını temsil eden ilkel değer

4.4.32 Symbol türü

olası tüm Symbol değerlerinin kümesi

4.4.33 Symbol nesnesi

standart yerleşik Symbol oluşturucusunun bir örneği olan Object türü üyesi

4.4.34 işlev

bir altyordam olarak çağrılabilen Object türü üyesi

4.4.35 yerleşik işlev

bir işlev olan yerleşik nesne

4.4.36 yerleşik oluşturucu

bir oluşturucu olan yerleşik işlev

4.4.37 özellik

bir anahtar (bir String değeri veya bir Symbol değeri) ile bir değeri ilişkilendiren, bir nesnenin parçası

4.4.38 yöntem

bir özelliğin değeri olan işlev

4.4.39 yerleşik yöntem

yerleşik bir işlev olan yöntem

4.4.40 nitelik

bir özelliğin bazı karakteristiklerini tanımlayan iç değer

4.4.41 kendi özelliği

doğrudan kendi nesnesi tarafından içerilen özellik

4.4.42 kalıtılan özellik

bir nesnenin kendi özelliği olmayan, ancak nesnenin prototipinin bir özelliği (kendi özelliği veya kalıtılan) olan özelliği

4.5 Bu Belirtimin Düzenlenişi

Bu belirtimin geri kalanı aşağıdaki gibi düzenlenmiştir:

Madde 5, belirtim boyunca kullanılan gösterim kurallarını tanımlar.

Maddeler 6 ila 10, ECMAScript programlarının içinde çalıştığı yürütme ortamını tanımlar.

Maddeler 11 ila 17, sözdizimsel kodlaması ve tüm dil özelliklerinin yürütme anlambilimi dahil olmak üzere asıl ECMAScript programlama dilini tanımlar.

Maddeler 18 ila 28, ECMAScript standart kütüphanesini tanımlar. Bunlar, ECMAScript programları yürütülürken onlar tarafından kullanılmak üzere mevcut olan tüm standart nesnelerin tanımlarını içerir.

Madde 29, SharedArrayBuffer destekli bellek üzerindeki erişimlerin bellek tutarlılık modelini ve Atomics nesnesinin yöntemlerini açıklar.