ES11 Nedir? ECMAScript 2020 Nedir?

Sayfayı kopyala
ECMAScript (kısaca ES), Ecma International tarafından ECMA-262 dokümanında yayınlanan ve her yıl güncellenen JavaScript standartıdır. Temel amacı, tüm tarayıcılarda ve çalışma ortamlarında (Node.js, Deno vb.) uyumlu, standartlaşmış bir JavaScript mimarisi sağlamaktır.
💡 Özet (TL;DR):
- ES11 Nedir?: Haziran 2020'de resmi olarak onaylanan 11. ECMAScript sürümüdür.
- Kilit Yenilikler: Optional Chaining (
?.), Nullish Coalescing (??), BigInt,Promise.allSettled,globalThisve Dynamic Imports.- Motto: Daha güvenli nesne erişimi, daha temiz varsayılan değer atamaları ve gelişmiş asenkron kontrol.
ES11 İle Gelen Yenilikler
ES11 sürümü, kod yazımını daha yalın ve güvenli hale getiren birçok operatör ve yerleşik (built-in) nesne desteği getirmiştir.
1. Optional Chaining (Seçimli Zincirleme - ?.)
İç içe geçmiş nesne (object) yapılarında, ara özelliklerin var olup olmadığını kontrol etmeden derinlikteki bir değere ulaşmaya çalışmak Javascript'te sıkça TypeError: Cannot read property ... of undefined hatasına sebep oluyordu.
ES11 öncesinde bu hatayı engellemek için uzun mantıksal zincirler yazıyorduk:
// Eski Yöntem (Hantal ve Okunması Zor)
let color = "";
if (building && building.room2 && building.room2.window1) {
color = building.room2.window1.color;
}
ES11 ile gelen Optional Chaining sayesinde bu kontrolü tek satıra indirebiliriz:
// Yeni Yöntem (Temiz ve Güvenli)
let color = building?.room2?.window1?.color;
// Eğer building, room2 veya window1 tanımlı (null ya da undefined) değilse hata fırlatmaz, doğrudan undefined döner.
2. Nullish Coalescing Operator (Boşluk Birleştirme Operatörü - ??)
JavaScript'te Mantıksal VEYA (||) operatörü, sol taraftaki değer falsy (false, 0, "", null, undefined, NaN) olduğunda sağdaki varsayılan değeri atar. Ancak bazen 0 veya boş string ("") geçerli bir değerdir ve bunların üzerine varsayılan değer yazılmasını istemeyiz.
?? operatörü sadece değer null veya undefined olduğunda sağdaki fallback değeri atar:
let userAge = 0;
let age1 = userAge || 18; // age1 = 18 olur (Çünkü 0 falsy değerdir)
let age2 = userAge ?? 18; // age2 = 0 olur (Çünkü 0 null ya da undefined değildir)
|| ve ?? Operatörlerinin Değer Değerlendirme Farkı
| Sol Değer | Mantıksal VEYA (sol || "Varsayılan") | Nullish Coalescing (sol ?? "Varsayılan") |
| :--- | :--- | :--- |
| null | "Varsayılan" | "Varsayılan" |
| undefined | "Varsayılan" | "Varsayılan" |
| "" (Boş String) | "Varsayılan" | "" |
| 0 | "Varsayılan" | 0 |
| false | "Varsayılan" | false |
3. BigInt: Çok Büyük Sayılar İçin Tam Sayı Desteği
JavaScript'te Number tipi güvenli olarak en fazla $2^{53} - 1$ (Number.MAX_SAFE_INTEGER) değerini taşıyabilir. Bu sınırdan daha büyük tam sayılarla hassas matematik işlemleri yapmak imkansızdı.
ES11 ile gelen BigInt veri tipi, teorik olarak sınırsız büyüklükte tam sayıları yönetebilmenizi sağlar. Bir sayıyı BigInt yapmak için sonuna n eklemeniz veya BigInt() fonksiyonunu kullanmanız yeterlidir:
const maxSafe = 9007199254740991n;
const hugeNumber = BigInt("900719925474099123456789");
console.log(maxSafe + 1n); // 9007199254740992n (Hassas olarak hesaplanır)
4. Promise.allSettled
Promise.all(), kendisine verilen promise listesindeki tek bir promise bile hata alsa (reject edilse) tüm işlemi yarıda kesip hataya düşer. Promise.allSettled ise hata durumlarından bağımsız olarak tüm promiselerin tamamlanmasını (fulfilled veya rejected) bekler ve hepsinin sonucunu bir dizi olarak raporlar:
const promises = [
Promise.resolve("Başarılı"),
Promise.reject("Hata Oluştu"),
Promise.resolve("Başarılı 2")
];
Promise.allSettled(promises).then((results) => {
results.forEach((result) => console.log(result.status));
// Çıktı sırasıyla: "fulfilled", "rejected", "fulfilled"
});
5. globalThis Nesnesi
Farklı JavaScript çalışma ortamlarında küresel nesneye erişim yöntemleri farklılık gösteriyordu. Tarayıcıda window veya self, Node.js'te global, Web Worker'larda ise self kullanmak zorundaydık.
globalThis, kodun çalıştığı ortamdan bağımsız olarak küresel nesneye erişmek için standartlaştırılmış tek bir global pointer sunar:
// Hem tarayıcıda hem Node.js ortamında çalışır:
globalThis.setTimeout(() => {
console.log("Çalıştı");
}, 1000);
6. Dynamic Import (Dinamik Modül Yükleme)
Modülleri dosyanın en üstünde statik olarak import etmek yerine, sadece bir olay (örn: butona tıklama) gerçekleştiğinde asenkron olarak yükleyebilmemizi sağlar. Bu sayede başlangıç dosya boyutu (bundle size) ciddi oranda azaltılır:
// İhtiyaç anında yükleme (Dynamic Import)
button.addEventListener('click', async () => {
const { default: myModule } = await import('./myModule.js');
myModule.doSomething();
});
7. String.prototype.matchAll
matchAll metodu, bir Regex ifadesi ile eşleşen tüm sonuçları (yakalama grupları - capture groups dahil) detaylı bir iterator olarak döndürür:
const regex = /[1-3]/g;
const year = '1983';
for (const match of year.matchAll(regex)) {
console.log(match);
}
// Çıktı:
// ['1', index: 0, input: '1983', groups: undefined]
// ['3', index: 3, input: '1983', groups: undefined]
8. Namespace Export (export * as)
ES11 öncesinde başka bir dosyadan gelen modüllerin tamamını bir ad alanı (namespace) altında import edip hemen export etmek iki ayrı adım gerektiriyordu. Artık bu işlem tek satırda yapılabilir:
export * as MyComponent from './Component.js';
Sıkça Sorulan Sorular (FAQ)
Promise.all() ve Promise.allSettled() neye göre seçilmelidir?
Eğer işlemler birbirine bağımlıysa (biri başarısız olduğunda diğerlerinin çalışmasının anlamı yoksa) Promise.all() kullanılmalıdır. Ancak birbirinden bağımsız API istekleri atılıyorsa ve hata alan isteklerin başarılı olanları engellemesi istenmiyorsa Promise.allSettled() tercih edilmelidir.
BigInt ve Number aritmetik işleme girebilir mi?
Hayır, güvenli sayı sınırları korunması amacıyla TypeError fırlatılır. İşlem yapmak için tipler açıkça (explicitly) birbirine dönüştürülmelidir. (örn: BigInt(5) + 10n).
Optional Chaining (?.) kullanımı performans kaybı yaşatır mı?
Hayır. Kodunuz derlendiğinde (transpilation - örn. Babel ile) optional chaining ifadeleri basit if-else veya üçlü (ternary) null kontrollerine dönüştürülür. Çalışma zamanında (runtime) herhangi bir ek yük getirmez, kodun güvenliğini artırır.
Bu Yazıda Yapılan Değişiklikler
- 20.06.2026: Yazı modernize edildi. BigInt, globalThis, Dynamic Import konuları, detaylı karşılaştırma tablosu ve FAQ bölümü eklendi.
- 11.05.2022: Yazı özeti düzenlendi.
