Teknik Detaylar

ES9 Nedir? ECMAScript 2018 Nedir?

← Teknik Detaylar
2021-10-19 ~ 2026-06-21 · 4 dk okuma
ES9 Nedir? ECMAScript 2018 Nedir?
Bu yazıyı yapay zekâ ile tartış
Sayfayı kopyala

💡 Özet (TL;DR):

  • ES9 (ES2018) Nedir?: Haziran 2018'de yayınlanan, JavaScript'e nesneler için rest/spread operatörleri, regex iyileştirmeleri ve asenkron iterasyon desteği kazandıran 9. ECMAScript sürümüdür.
  • Kritik Yenilikler: RegExp isimlendirilmiş yakalama grupları, Object Rest/Spread, Promise.prototype.finally() ve for await...of döngüsü.
  • Önemi: Özellikle nesne kopyalama/seçme işlemlerini kolaylaştırmış ve asenkron veri akışlarının (stream) işlenmesini standart hale getirmiştir.

ES9 (ECMAScript 2018), Haziran 2018'de yayınlanan 9. ECMAScript sürümüdür.


ES9 Özellikleri ve Karşılaştırmalı Kullanım

ÖzellikES9 Öncesi YöntemES9 Modern Yöntem
Object Rest/SpreadObject.assign({}, obj) veya _.omitconst { foo, ...rest } = obj;
Promise Kapanışıthen ve catch içinde tekrar eden kodpromise.finally(() => { ... })
RegExp Yakalama Gruburesults[1] (İndeks tabanlı ve kırılgan)results.groups.year (İsimlendirilmiş grup)
Asenkron İterasyonManuel promise zincirlerifor await (const val of stream)

ES9 ile Yeni Neler Geldi?

ES9 ile birlikte JavaScript'e aşağıdaki yenilikler geldi:

  • Regex değişiklikleri (İsimlendirilmiş gruplar, lookbehind aramalar)
  • Object Rest/Spread nitelikleri
  • Promise.prototype.finally()
  • Asenkron oluşturucular ve iterasyon (Asynchronous Generators & Iteration)

1. Regex Değişiklikleri

Yeni Regex Parametresi /s

Genel olarak . (nokta) regex cümleleri içinde herhangi bir karakter anlamına gelir. ECMAScript buna iki istisna getiriyordu:

  • Nokta satır sonu karakterlerini (\r, \n gibi) kapsamıyordu.
  • Nokta astral, yani BMP olmayan karakterleri (emojiler vb.) desteklemiyordu.

ES9 ile birlikte eklenen /s parametresi sayesinde nokta karakterinin gerçek anlamda tüm karakterleri kapsaması sağlanabiliyor ve yukarıdaki iki kısıt ortadan kalkmış oluyor.

İsim Verilen Yakalama Grupları (Named Capture Groups)

ES9'a kadar yakalama gruplarına bir isim veremiyor ve indeksleri ile kullanıyorduk. ES9 ile birlikte bu gruplara ait değerleri isimleri ile çağırmanız mümkündür:

// ES9 Öncesi (İndeks tabanlı)
const REGEX_OLD = /([0-9]{4})-([0-9]{2})-([0-9]{2})/;
const resultsOld = REGEX_OLD.exec('2018-07-12');
console.log(resultsOld[1]); // 2018
console.log(resultsOld[2]); // 07
console.log(resultsOld[3]); // 12

// ES9 ve Sonrası (İsimlendirilmiş gruplar)
const REGEX_NEW = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/;
const resultsNew = REGEX_NEW.exec('2018-07-12');
console.log(resultsNew.groups.year);  // 2018
console.log(resultsNew.groups.month); // 07
console.log(resultsNew.groups.day);   // 12

RegExp Lookbehind Assertions (Geriye Dönük Arama)

Bu arama türünün pozitif ve negatif olarak iki tipi vardır:

1. Positive ((?<=...))

'<div> #element </div>'.replace(/(?<=#)element/g, 'eleman');
// Bu regex sonucunda metnimiz <div> #eleman </div> şekline dönüşür.

(?<=#)element/g şeklinde bir regex ile aranan metnin # karakteri ile başlaması gerekir, fakat # karakteri sonuç olarak değiştirilmez.

2. Negative ((?<!...))

'<div> #element </div>'.replace(/(?<!#)element/g, 'eleman');
// Bu regex sonucunda metnimiz <div> #element </div> olarak kalır ve değiştirilmez.

Bu regex ile aranan metin # karakteri ile başlarsa yakalanmamış olur.

RegExp Unicode Property Escape Karakteri

ES9 ile birlikte karakterleri Unicode betik tipini belirterek test edebiliyoruz:

/\p{Script=Arabic}/u.test('أليف');  // true
/\p{Script=Greek}/u.test('μ');    // true
/\p{Script=Greek}/u.test('أليف');  // false
/\p{Script=Greek}/u.test('a');   // false
/\p{Script=Latin}/u.test('a');   // true

Unicode betik tiplerinin tam bir listesine ilgili Unicode dokümanından ulaşabilirsiniz.


2. Object Rest/Spread Nitelikleri (Properties)

ES6 ile gelen rest/spread operatörü sadece dizilerle (arrays) çalışıyordu. Rest/spread operatörü ES9 ile beraber nesnelerle de (objects) çalışmaya başladı:

const obj = {foo: 1, bar: 2, baz: 3};
const {foo, ...rest} = obj;
// foo = 1
// rest = {bar: 2, baz: 3}

Benzer şekilde birden çok parametre alan bir fonksiyona spread operatörü kullanarak bir nesneyi parametre olarak gönderebiliriz:

function func({param1, param2, ...rest}) { // rest operator
    console.log('Tüm parametreler: ', {param1, param2, ...rest}); // spread operator
    return param1 + param2;
}

3. Promise.prototype.finally

Bu yeni callback tipi, promise türündeki çağrıların tümünden sonra (hata alınsın ya da alınmasın) çalıştırılır:

aPromiseFunction()
  .then(() => {
    // Tamamlandığında çalışacak kod
  })
  .catch(err => {
    // Hata durumunda çalışacak kod
  })
  .finally(() => {
    // Her durumda (en son) çalışacak kod
  });

💡 Not: ES10 ile birlikte catch çağrısına gönderilen error parametresi isteğe bağlı hale geldi.


4. Asenkron Oluşturucular ve İterasyon

Generator fonksiyonlar, çalışma sırasında duraklatılabilen ve devam ettirilebilen fonksiyonlardır. ES9 ile birlikte async anahtar kelimesini kullanarak asenkron generator fonksiyonlar oluşturabiliyoruz.

Asenkron generatorlerin normal generatorlerden farkı, next() metotlarının bir değer yerine Promise döndürmesidir:

async function* load() {
  yield await Promise.resolve(1);
  yield await Promise.resolve(2);
}
   
const l = load();
l.next().then(r => console.log(r)); // {value: 1, done: false}
l.next().then(r => console.log(r)); // {value: 2, done: false}
l.next().then(r => console.log(r)); // {value: undefined, done: true}

async anahtar kelimesi ile tanımladığımız asenkron generatorleri klasik bir for döngüsü içinde asenkron olarak kullanamayız. Bunu sağlamak için for await...of yapısını kullanmalıyız. Bu sayede fonksiyondan değer dönene kadar döngünün devam etmesini bekletebiliriz:

async function* load() {
  yield await Promise.resolve(1);
  yield await Promise.resolve(2);
}
   
async function test() {
  for await (const val of load()) {
    console.log(val);
  }
}
Bu Yazıda Yapılan Değişiklikler
  • 21.06.2026: RegExp tanımlarındaki eğik çizgi (/) eksiklikleri ve Promise zincirindeki kapanış parantezini yorum satırına alan sözdizimi (syntax) hataları düzeltildi. Kod bloklarına dil etiketleri eklendi. İmla ve marka yazımları düzeltildi. Karşılaştırma tablosu ve özet eklendi.
  • 11.05.2022: Yazı özeti düzenlendi.