# ES11 Nedir? ECMAScript 2020 Nedir?

> ECMAScript 2020 (ES11) sürümüyle gelen Optional Chaining, Nullish Coalescing, BigInt, globalThis ve Promise.allSettled özelliklerini öğrenin.

[ECMAScript](/tr/ecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler) (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`, `globalThis` ve 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:

```javascript
// 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:

```javascript
// 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:

```javascript
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:

```javascript
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:

```javascript
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:

```javascript
// 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:

```javascript
// İ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:

```javascript
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:

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

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/es11-nedir-ecmascript-2020-nedir
