ES12 Nedir? ECMAScript 2021 Nedir?

Sayfayı kopyala
💡 Ö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.anytry-catch bloğundaki parantez kapatma hatası veWeakRef'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, 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 | |
??= (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.anyWeakRef&&=,||=ve??=operatörleriNumeric 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:
// 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:
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:
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ü
let number1 = 10;
let number2 = 15;
number1 &&= number2;
Bu kodu bu operatör olmadan önce şöyle yazmamız gerekiyordu:
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ü
let number1 = null;
let number2 = 15;
number1 ||= number2;
Eski yazım karşılığı:
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ü
let number1 = null;
let number2 = 15;
number1 ??= number2;
Eski yazım karşılığı:
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:
// 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.anytry-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.
