31 puan yazan GN⁺ 2025-04-16 | 4 yorum | WhatsApp'ta paylaş
  • JavaScript 2025'te de gelişmeye devam ediyor ve bazı özellikler çok bilinmese de son derece kullanışlı
  • Yeni Iterator helper metodları, büyük ölçekli veri dönüşümlerinde çok daha bellek verimli çalışıyor
  • Dizinin sonundan erişim sağlayan at(), sade Promise.withResolvers() kullanımı, derin kopyalama için structuredClone() gibi özellikler öne çıkıyor
  • Set için küme işlemleri, template string tagging fonksiyonları ve WeakMap/WeakSet kullanım biçimleri hâlâ birçok geliştiricinin gözden kaçırdığı konular arasında

Iterator Helper metodları

  • Mevcut arr.filter().map() gibi zincirlemelerde her adımda yeni bir dizi oluşturulduğu için verimsizlik oluşur
  • arr.values().drop(10).take(10).map(...).toArray() gibi iterator tabanlı zincirleme ile bu durum iyileştirilebilir
  • Başlıca metodlar:
    • drop(): ilk n öğeyi atlar
    • take(): yalnızca ilk n öğeyi alır
    • filter(), map(), flatMap(): dizi metodlarına benzer şekilde çalışır
    • reduce(), some(), every(), find(): koşul testleri ve birikimli hesaplamaları destekler
    • toArray(): sonucu diziye dönüştürür
  • Safari desteği 31 Mart 2025 itibarıyla başladı, ancak henüz tüm tarayıcılar tarafından desteklenmiyor

Array at()

  • arr.at(n), arr[n] ile benzerdir ancak negatif indeksleme ile sondan erişim sağlar
  • Örnek: [10, 20, 30].at(-1)30
  • arr[arr.length - 1] gibi zahmetli bir kullanım olmadan son öğeye erişilebilir

Promise.withResolvers()

  • Eski yaklaşım: new Promise((resolve, reject) => { ... }) içinde resolve/reject değerlerini dışarıda saklamak
  • Artık: const { promise, resolve, reject } = Promise.withResolvers() ile daha kısa ve sezgisel kullanım mümkün

String.replace() callback kullanımı

  • replace() ve replaceAll() için ikinci argüman yalnızca string değil, bir callback fonksiyonu da olabilir
  • Örnek: "X, X, X".replaceAll("X", (match, i) => match + i)"X0, X3, X6"
  • Tek seferde çeşitli değiştirmeler yapılabilir → performans ve bellek açısından verimli

Değişken takası (Swap)

  • Eski yaklaşım: temp değişkeni kullanmak
  • Daha kısa yöntem: [a, b] = [b, a] ile array destructuring kullanarak değişkenleri takas etmek

structuredClone()

  • JSON.stringify() + JSON.parse() yerine daha doğru ve verimli derin kopyalama desteği sunar
  • Avantajları:
    • NaN, undefined, bigint gibi değerleri de destekler
    • Döngüsel referansları da güvenli biçimde kopyalar
    • Büyük nesnelerde bellek ve hız açısından daha verimlidir

Tagged Template Literals

  • Template string'ler belirli bir fonksiyonla parse edilebilir
  • HTML escape işlemleri gibi dinamik string son işleme senaryolarında kullanışlıdır
  • Örnek:
    escapeHtml tag fonksiyonuyla <br> ${'<br>'}<br> <br>

WeakMap / WeakSet

  • Normal Map, Set ile benzerdir ancak:
    • Anahtar olarak yalnızca nesnelere izin verir (primitive değerler olmaz)
    • GC hedefi olduğunda otomatik olarak kaldırılır
  • Döngüsel referans ihtimali olduğunda veya yan etki oluşturmadan nesne metadata'sı saklamak istendiğinde uygundur

Set için küme işlemleri desteği

JavaScript'te Set nesnesi için çeşitli mantıksal işlemler yeni eklendi:

  • difference(): fark kümesi (A - B)
  • intersection(): kesişim kümesi (A ∩ B)
  • union(): birleşim kümesi (A ∪ B)
  • symmetricDifference(): simetrik fark kümesi (A △ B)
  • isDisjointFrom(): ortak öğe olup olmadığını kontrol eder
  • isSubsetOf(): alt küme olup olmadığını kontrol eder
  • isSupersetOf(): üst küme olup olmadığını kontrol eder

4 yorum

 
wfedev 2025-04-23

Literal parse edildiğinde değişkenlerin bile string olarak çıkması sorunu çözülmüş gibi görünüyor. Paylaşım için teşekkürler.

 
pompapa 2025-04-17

Örnek: "X, X, X".replaceAll("X", (match, i) => match + i)"X0, X1, X2"

Örnek hatalı. i, eşleşmenin bulunduğu konumu taşır.
Bu nedenle sonuç değeri "X0, X3, X6" olur.

 
xguru 2025-04-17

Aa, doğruymuş. Yapay zeka örneği yanlış üretmiş. Düzelttim. Keskin tespitiniz için teşekkürler!

 
click 2025-04-16

values, Java Stream API gibi hissettirdiği için karşılaştırdım; dizi boyutu küçükse values olmadan filter kullanmak daha hızlı görünüyor. İteratör tabanlı olduğu için zincirleme arttıkça bir kez values üzerinden geçme yöntemi daha hızlı olma etkisi de gösterebilir. Benchmark için https://jsperf.app/dixutu adresine bakabilirsiniz.