# ES12 Nedir? ECMAScript 2021 Nedir?

> ECMAScript 2021 (ES12) ile gelen yenilikler: replaceAll, Promise.any, WeakRef, mantıksal atama operatörleri ve nümerik ayraçlar.

> 💡 **Özet (TL;DR):**
> - **Nedir:** Haziran 2021'de yayınlanan, JavaScript standartlarının (ECMAScript) 12. ana sürümüdür.
> - **Kritik Hata Düzeltmesi:** Orijinal yazıdaki `Promise.any` try-catch bloğundaki parantez kapatma hatası ve `WeakRef`'in tanımsız dönme riski (dereference hatası) giderilmiştir.
> - **Temel Özellikler:** `Promise.any()`, `String.prototype.replaceAll()`, mantıksal atama operatörleri (`&&=`, `||=`, `??=`), nümerik ayraçlar (`1_000_000`) ve zayıf referanslar (`WeakRef`).

[ECMAScript](/tr/ecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler), kısa adıyla ES, Ecma International tarafından ECMA-262 dokümanında yayınlanan ve her yıl yenilenen JavaScript standardıdır. Asıl amacı JavaScript için bir standart geliştirerek tüm tarayıcılarda uyumlu çalışabilen kodlar yazılmasına olanak vermektir. Bununla birlikte Node.js gibi sunucu tabanlı motorlar da ECMAScript ile uyum göstermektedir.

**ES12 (ECMAScript 2021), Haziran 2021'de yayınlanan 12. ECMAScript sürümüdür.**

---

### ES12 Mantıksal Atama Operatörleri Hızlı Referans Tablosu

| Operatör | Kısa Yazım | Açık Yazım Karşılığı | Değer Atama Koşulu |
| :--- | :--- | :--- | :--- |
| **`&&=`** (Logical AND) | `x &&= y` | `if (x) { x = y; }` | `x` truthy (doğru) bir değer ise `y`'yi atar. |
| **`||=`** (Logical OR) | `x ||= y` | `if (!x) { x = y; }` | `x` falsy (yanlış) bir değer ise `y`'yi atar. |
| **`??=`** (Nullish Coalescing) | `x ??= y` | `if (x == null) { x = y; }` | `x` sadece `null` veya `undefined` ise `y`'yi atar. |

---

## ES12 ile Gelen Yenilikler

ES12 ile birlikte tanımlanan yeni özellikler şunlardır:

- `String.prototype.replaceAll()`
- `Promise.any`
- `WeakRef`
- `&&=`, `||=` ve `??=` operatörleri
- `Numeric separators` (Nümerik Ayraçlar)

---

### 1. String.prototype.replaceAll()

`replaceAll` metodu, sizi karmaşık düzenli ifadeler (regular expressions) kullanmaktan kurtaracak basit bir eklemedir. İsminden de anlaşılabileceği gibi bu metot ile bir string içerisinde aradığınız bir alt stringi bulunduğu her konumda başka bir stringle değiştirebilirsiniz:

```javascript
// Tüm x'leri e ile değiştirelim
// xvrxnbal evrenbal haline dönüşecektir.
'xvrxnbal'.replaceAll('x', 'e');
```

---

### 2. Promise.any()

ES12 ile birlikte yeni bir Promise metodu olan `Promise.any` geldi. Bu metot birden fazla Promise nesnesini kabul eder ve bunlardan herhangi biri başarıyla çözümlendiğinde çözümlenmiş (resolved) kabul edilir:

```javascript
try {
    // Promise.any metoduna dizi içerisinde birden fazla promise gönderiyoruz.
    const firstPromiseResolved = await Promise.any(promisesArray);
    // Promiselerden herhangi biri çözüldüğünde kodun bu bölümü çalışır
    console.log(firstPromiseResolved);
} catch (e) {
    // Hata oluşursa (tüm Promise'ler reject olursa) burası çalışacak
    console.error(e);
}
```

`Promise.any()`, gönderilen Promise'lerin hiçbirisi çözümlenmezse bir `AggregateError` hatası fırlatır. Bu hatayı catch bloğunda yakalayıp işlem yapabiliriz.

---

### 3. WeakRef (Zayıf Referanslar)

`WeakRef`, zayıf referanslar (weak references) oluşturmak için kullanılan bir sınıftır ve amacı diğer bir nesneye ait zayıf referans tutmaktır. Normalde JavaScript'te başka bir nesnenin referans gösterdiği nesneler çöp toplayıcı (garbage collector) tarafından bellekten temizlenmezken, `WeakRef` tipinde bir referans varsa garbage collector bu referansı temizleyebilir. 

Zayıf bağlantı kurduğunuz bir nesne, güçlü referanslarını kaybettikten sonra her an temizlenebilir. JavaScript motorlarının çöp toplama algoritmaları farklı çalıştığından veya aynı motorun bir sonraki versiyonunda değişebileceğinden davranışın nasıl olacağını kestirmek son derece güçtür. Bu nedenle Ecma, mecbur kalmadıkça `WeakRef` kullanımından kaçınmanızı önerir. 

Eğer `WeakRef` kullanmak isterseniz, nesneye erişmeden önce referansın hala var olup olmadığını kontrol etmeniz gerekir:

```javascript
const largeObject = new WeakRef({
     name: "CacheMechanism",
     type: "Cache",
});

// Güvenli dereferencing kontrolü
const obj = largeObject.deref();
if (obj) {
    console.log(obj.name); // CacheMechanism
    console.log(obj.type); // Cache
} else {
    console.log("Nesne bellekten temizlenmiş.");
}
```

---

### 4. Mantıksal Atama Operatörleri (Logical Assignment Operators)

ES12 ile birlikte üç yeni mantıksal atama operatörü geldi: `&&=`, `||=` ve `??=`. Bu operatörler sayesinde bir değişkene değer atarken mantıksal ifadeleri daha kısa yazabiliyoruz.

#### ES12 `&&=` Operatörü
```javascript
let number1 = 10;
let number2 = 15;

number1 &&= number2;
```

Bu kodu bu operatör olmadan önce şöyle yazmamız gerekiyordu:
```javascript
let number1 = 10;
let number2 = 15;

if (number1) {
    number1 = number2;
}
```

Özetle, soldaki değişkenin değeri true (truthy) ise sağdaki değişkenin değerini soldakine atıyoruz.

#### ES12 `||=` Operatörü
```javascript
let number1 = null;
let number2 = 15;

number1 ||= number2;
```

Eski yazım karşılığı:
```javascript
let number1 = null;
let number2 = 15;

if (!number1) {
    number1 = number2;
}
```

Soldaki değişken false (falsy) ise sağdaki değişkenin değerini soldaki değişkene atıyoruz.

#### ES12 `??=` Operatörü
```javascript
let number1 = null;
let number2 = 15;

number1 ??= number2;
```

Eski yazım karşılığı:
```javascript
let number1 = null;
let number2 = 15;

if (number1 == null || number1 == undefined) {
    number1 = number2;
}
```

Bu operatör soldaki değişken `null` veya `undefined` (tanımsız) ise sağdaki değişkenin değerini soldakine atar. `||=` operatörü her türlü falsy değerde (0, boş string vb.) çalışırken, `??=` sadece `null` veya `undefined` değerlerinde çalışır.

---

### 5. Nümerik Ayraçlar (Numeric Separators)

Büyük sayılarla çalışmak genelde zordur. Kod içerisinde `123456789473` şeklinde bir sayı gördüğünüzde bunun büyüklüğünü algılamak zor olur. ES12 ile birlikte bu tarz büyük sayılar için alt çizgi (`_`) kullanarak ayraç tanımlama şansına sahip olduk:

```javascript
// ES12'den önce
const number = 123456789473;

// ES12'den sonra
const number = 123_456_789_473; // 123 milyar, 456 milyon...
```

---

##### Bu Yazıda Yapılan Değişiklikler

- 11.05.2022: Yazı özeti düzenlendi.
- 21.06.2026: `Promise.any` try-catch bloğundaki sözdizimi (syntax) hatası giderildi, `WeakRef`'in tanımsız durumlarındaki çökme riski güvenli kontrol mekanizması eklenerek düzeltildi. Türkçe imla hataları (standardıdır, tarayıcıya, Node.js vb.) giderildi, TL;DR özet ve mantıksal operatörler hızlı referans tablosu eklendi.

---

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/es12-nedir-ecmascript-2021-nedir
