Javascript ES6 (ECMAScript 2015) ile Gelen Yenilikler

ECMAScript 2015, yaygın olarak ES6 olarak bilinen, JavaScript'e önemli ve büyük yenilikler getiren bir sürümdür. Bu yenilikler, dilin daha modern, okunabilir ve yönetilebilir olmasını sağlamıştır.

1. let ve const Anahtar Kelimeleri (Blok Kapsamı)

ES6 öncesinde sadece var anahtar kelimesi vardı ve fonksiyon kapsamına sahipti. let ve const ile blok kapsamı (block scope) tanıtıldı.

2. Arrow Functions (Ok Fonksiyonları)

Daha kısa ve okunabilir fonksiyon sözdizimi sunar. En önemli farklarından biri this bağlamını (context) miras almasıdır.

// Geleneksel fonksiyon
function topla(a, b) {
  return a + b;
}

// Arrow function
const toplaOk = (a, b) => a + b;
console.log(toplaOk(5, 3)); // 8

// Tek parametre ve tek satırlık gövde
const kareAl = sayi => sayi * sayi;
console.log(kareAl(4)); // 16

// this bağlamı örneği
class Kisi {
  constructor(ad) {
    this.ad = ad;
  }

  selamVerGeleneksel() {
    setTimeout(function() {
      // console.log("Merhaba " + this.ad); // this burada undefined (veya window global objesi)
    }, 100);
  }

  selamVerOk() {
    setTimeout(() => {
      console.log("Merhaba " + this.ad); // this, Kisi sınıfına bağlı
    }, 100);
  }
}

const ali = new Kisi("Ali");
ali.selamVerOk(); // Çıktı: Merhaba Ali (biraz gecikmeli)

3. Template Literals (Şablon Dizeleri)

Dizeleri daha esnek bir şekilde tanımlamak için backtick (`) karakteri kullanılır. Dize içinde değişkenleri $ { } sözdizimi ile kolayca kullanmaya ve çok satırlı dizeler oluşturmaya olanak tanır.

const ad = "Ayşe";
const soyad = "Yılmaz";
const yas = 30;

// Geleneksel yöntem
const mesajGeleneksel = "Merhaba, benim adım " + ad + " " + soyad + " ve " + yas + " yaşındayım.";
console.log(mesajGeleneksel);

// Template Literals ile
const mesajEs6 = `Merhaba, benim adım ${ad} ${soyad} ve ${yas} yaşındayım.`;
console.log(mesajEs6);

// Çok satırlı dize
const cokSatirli = `Bu bir
çok satırlı
dizedir.`;
console.log(cokSatirli);

4. Destructuring Assignment (Yıkıcı Atama)

Dizilerden veya nesnelerden değerleri daha kısa bir sözdizimiyle çıkarmaya olanak tanır.

5. Default Parameters (Varsayılan Parametreler)

Fonksiyon parametrelerine, çağrıldığında bir değer belirtilmediğinde kullanılacak varsayılan değerler atamaya olanak tanır.

// ES6 öncesi
function selamlaEski(isim) {
  isim = isim === undefined ? "Misafir" : isim;
  console.log(`Merhaba ${isim}!`);
}
selamlaEski(); // Merhaba Misafir!
selamlaEski("Deniz"); // Merhaba Deniz!

// ES6 ile varsayılan parametreler
function selamla(isim = "Misafir") {
  console.log(`Merhaba ${isim}!`);
}
selamla(); // Merhaba Misafir!
selamla("Deniz"); // Merhaba Deniz!

6. Rest Parametreleri ve Spread Operatörü (...)

7. Classes (Sınıflar)

JavaScript'te kalıtım ve nesne tabanlı programlamayı daha okunabilir ve anlaşılır hale getirmek için sözdizimsel şeker (syntactic sugar) olarak sınıflar tanıtıldı. Aslında prototype tabanlı kalıtımın üzerine inşa edilmiştir.

class Kisi {
  constructor(ad, soyad) {
    this.ad = ad;
    this.soyad = soyad;
  }

  tamAdGetir() {
    return `${this.ad} ${this.soyad}`;
  }
}

class Ogrenci extends Kisi {
  constructor(ad, soyad, ogrenciNo) {
    super(ad, soyad); // Üst sınıfın constructor'ını çağırır
    this.ogrenciNo = ogrenciNo;
  }

  bilgiGetir() {
    return `${this.tamAdGetir()} (${this.ogrenciNo})`;
  }
}

const ogrenci1 = new Ogrenci("Mert", "Demir", "12345");
console.log(ogrenci1.tamAdGetir()); // Mert Demir
console.log(ogrenci1.bilgiGetir()); // Mert Demir (12345)

8. Modules (Modüller)

JavaScript kodunu ayrı dosyalarda düzenlemeyi ve bu dosyaları kolayca birbirine bağlamayı sağlayan standart bir modül sistemi getirildi (import ve export). Bu, kodu daha düzenli, bakımı kolay ve yeniden kullanılabilir hale getirir.

9. Promises (Sözler)

Asenkron işlemleri daha kolay yönetmek için tanıtılan bir yapıdır. Özellikle callback hell (geri çağırma cehennemi) olarak bilinen karmaşık iç içe geçmiş asenkron fonksiyon yapılarının önüne geçer. Bir Promise, asenkron bir işlemin nihai başarı (resolved) veya başarısızlık (rejected) durumunu temsil eder.

const veriyiGetir = new Promise((resolve, reject) => {
  // Asenkron bir işlem simüle edelim
  setTimeout(() => {
    const basarili = true;
    if (basarili) {
      resolve("Veri başarıyla çekildi!");
    } else {
      reject("Veri çekme hatası oluştu.");
    }
  }, 2000); // 2 saniye sonra
});

veriyiGetir
  .then(mesaj => {
    console.log(mesaj); // Veri başarıyla çekildi! (2 sn sonra)
  })
  .catch(hata => {
    console.error(hata);
  });

10. Iterators ve Generators

11. Yeni Koleksiyonlar (Set, Map, WeakSet, WeakMap)

// Set örneği
const setim = new Set([1, 2, 2, 3]);
console.log(setim); // Set(3) {1, 2, 3}

// Map örneği
const mapim = new Map();
mapim.set('ad', 'Müge');
mapim.set(1, 'sayı');
console.log(mapim.get('ad')); // Müge