Tartışma

WeakMap ve WeakSet Kullanımı

Başlatan QuantumRuh · 14 Tem 2026 20:01 · 16 Görüntülenme · 0 Yanıtlar
Konuyu Açan #0
WeakMap ve WeakSet Kullanımı

Web uygulamaları geliştirirken, özellikle JavaScript ekosisteminde, veri yapıları ve bellek yönetimi arasındaki ilişkiyi doğru anlamak kritik öneme sahiptir. Hepimizin sıkça kullandığı Map ve Set objeleri, anahtar-değer çiftlerini veya benzersiz değer koleksiyonlarını yönetmek için oldukça güçlü araçlar sunar. Ancak bu yapıların bellek üzerindeki davranışları, özellikle de çöp toplama (garbage collection) mekanizmasıyla etkileşimleri, bazen beklenmedik bellek sızıntılarına yol açabilir. İşte tam bu noktada, WeakMap ve WeakSet devreye giriyor; bellek yönetimi konusunda bize daha esnek ve güvenli bir yaklaşım sunuyorlar.

WeakMap Nedir ve Neden İhtiyaç Duyarız?

Geleneksel Map objeleri, anahtarlarını güçlü referanslarla tutar. Bu ne anlama geliyor? Eğer bir nesneyi Map'in anahtarı olarak kullanırsanız, o nesneye başka hiçbir yerden referans olmasa bile, Map içinde bulunduğu sürece çöp toplayıcı tarafından temizlenemez. Bu durum, özellikle uzun ömürlü uygulamalarda veya dinamik olarak oluşturulan ve yok olan birçok nesneyle çalıştığınızda, istenmeyen bellek sızıntılarına neden olabilir. Nesnenin artık kullanılmadığını düşünseniz bile, Map içindeki referansı yüzünden bellekte kalmaya devam eder.

WeakMap ise bu soruna zarif bir çözüm getirir. WeakMap'in anahtarları sadece nesneler olabilir ve bu anahtarlar zayıf referanslarla tutulur. Yani, eğer bir WeakMap anahtarı olan nesneye başka hiçbir yerden güçlü bir referans kalmazsa, çöp toplayıcı o nesneyi bellekten temizleyebilir. Nesne temizlendiğinde, WeakMap içindeki ilgili anahtar-değer çifti de otomatik olarak ortadan kalkar. Bu, adeta hayalet bir referans gibi... Nesne varsa tutar, yoksa kendiliğinden temizlenir.

WeakMap Kullanım Alanları ve Kısıtlamaları

WeakMap'in bu özelliği, onu belirli senaryolar için vazgeçilmez kılar:

  • Nesnelere Özel Veri Ekleme (Private Data): Bir nesnenin dışarıdan erişilememesi gereken, ancak o nesneyle ilişkili özel verileri saklamak istediğinizde WeakMap kullanabilirsiniz. Nesne bellekten silindiğinde, bu özel veriler de otomatik olarak temizlenir.
  • DOM Elemanlarına Meta Veri İliştirme: Web arayüzlerinde dinamik olarak oluşturulan DOM elemanlarına özel veriler veya durum bilgileri eklemek istediğinizde çok işe yarar. Eleman DOM'dan kaldırıldığında ve başka referansı kalmadığında, WeakMap içindeki verisi de otomatik olarak temizlenir, böylece bellek sızıntıları önlenir.
  • Hesaplama Sonuçlarını Önbelleğe Alma (Caching): Belirli bir nesneye bağlı olarak yapılan pahalı bir hesaplamanın sonucunu önbelleğe alabilirsiniz. Nesne var olduğu sürece önbellekteki sonucu kullanırsınız, nesne yok olduğunda önbellek girdisi de kendiliğinden silinir.

Peki, WeakMap'in bir bedeli yok mu? Elbette var. Zayıf referans mekanizması nedeniyle WeakMap'ler bazı önemli kısıtlamalara sahiptir:

  • Anahtarlar Sadece Nesne Olabilir: WeakMap anahtarı olarak ilkel değerler (string, number, boolean, symbol, null, undefined) kullanamazsınız. Sadece nesneler (
    CODE
    1Object
    ,
    CODE
    1Array
    ,
    CODE
    1Function
    ,
    CODE
    1Date
    ,
    CODE
    1RegExp
    vb.) anahtar olabilir.
  • Döngü Yapılamaz ve Boyutu Bilinemez: WeakMap üzerinde
    CODE
    1for...of
    döngüsü kullanamaz,
    CODE
    1.forEach()
    metodunu çağıramaz veya
    CODE
    1.size
    özelliğine erişemezsiniz. Neden mi? Çünkü herhangi bir anda, anahtarların çöp toplayıcı tarafından silinip silinmediği garanti edilemez. Eğer döngü sırasında bir anahtar silinirse, döngünün davranışı öngörülemez hale gelir. Bu belirsizlik yüzünden, WeakMap'in o anki tam boyutunu bilmek de mümkün değildir. Bu, deterministik olmayan bir yapı olmasından kaynaklanır.
  • Metotlar Sınırlıdır: Sadece
    CODE
    1get(key)
    ,
    CODE
    1set(key, value)
    ,
    CODE
    1has(key)
    ve
    CODE
    1delete(key)
    metotları mevcuttur.

Bu kısıtlamalar, WeakMap'i genel amaçlı bir veri yapısı olmaktan çıkarıp, çok özel ve niş durumlarda parlayan bir araç haline getirir.

WeakMap ile Pratik Bir Örnek: Nesnelere Özel Veri Ekleme

Diyelim ki bir
CODE
1User
sınıfınız var ve her kullanıcı nesnesine, dışarıdan doğrudan erişilememesi gereken ancak kullanıcı nesnesi var olduğu sürece geçerli olacak bazı özel ayarlar veya oturum bilgileri eklemek istiyorsunuz.

CODE
12345678910111213141516171819202122232425262728
let userSettings = new WeakMap();

class User {
  constructor(name, id) {
    this.name = name;
    this.id = id;
  }
}

let user1 = new User("Alice", 101);
let user2 = new User("Bob", 102);

// Kullanıcı nesnelerine özel ayarları WeakMap'e ekliyoruz
userSettings.set(user1, { theme: "dark", notifications: true });
userSettings.set(user2, { theme: "light", notifications: false });

console.log("Alice'in ayarları:", userSettings.get(user1)); // { theme: 'dark', notifications: true }

// user1 nesnesine olan tüm güçlü referansları kaldıralım
user1 = null; // Artık user1'e başka bir yerden referans yok

// Çöp toplayıcı çalıştığında (ne zaman çalışacağı garanti değildir),
// user1 nesnesi bellekten silinecek ve WeakMap'teki ilgili giriş de otomatik olarak kaybolacak.
// Bu durumu doğrudan gözlemlemek zordur, ancak WeakMap'in çalışma prensibi budur.

// user2 hala mevcut
console.log("Bob'un ayarları:", userSettings.get(user2)); // { theme: 'light', notifications: false }


Bu örnekte,
CODE
1userSettings
WeakMap'i,
CODE
1User
nesnelerine bağlı özel ayarları tutuyor.
CODE
1user1 = null
dediğimizde,
CODE
1user1
nesnesine olan son güçlü referansı kaldırmış oluyoruz. Bir süre sonra çöp toplayıcı
CODE
1user1
nesnesini bellekten sildiğinde,
CODE
1userSettings
içindeki
CODE
1user1
ile ilişkili veri de otomatik olarak temizlenir. İşte bu, bellek sızıntılarını önlemenin şık bir yolu.

WeakSet Nedir ve WeakMap ile Benzerlikleri/Farkları Nelerdir?

WeakSet, WeakMap'in "set" karşılığıdır. Yani, sadece nesnelerden oluşan benzersiz bir koleksiyon tutar ve bu nesneleri zayıf referanslarla saklar. [B]WeakMap[/'te olduğu gibi, eğer bir nesneye [B]WeakSet[/B] dışında başka hiçbir yerden güçlü bir referans kalmazsa, o nesne çöp toplayıcı tarafından temizlenebilir ve WeakSet içindeki varlığı da otomatik olarak son bulur.

WeakSet de WeakMap ile benzer kısıtlamalara sahiptir:

  • Sadece Nesneler Depolayabilir: WeakSet'e ilkel değerler ekleyemezsiniz. Yalnızca nesneleri saklayabilir.
  • Döngü Yapılamaz ve Boyutu Bilinemez: WeakSet üzerinde döngü yapamazsınız ve
    CODE
    1.size
    özelliğine erişemezsiniz. Sebepleri WeakMap ile tamamen aynıdır; belirsizlik ve deterministik olmama durumu.
  • Metotları Sınırlıdır: Sadece
    CODE
    1add(value)
    ,
    CODE
    1has(value)
    ve
    CODE
    1delete(value)
    metotları mevcuttur.

WeakSet'in en yaygın kullanım alanlarından biri, bir nesnenin belirli bir "durum" koleksiyonuna ait olup olmadığını izlemektir. Örneğin, "şu anda aktif olan kullanıcılar", "işlenmeyi bekleyen görevler" gibi durumları yönetirken, bu nesneler yok olduğunda otomatik olarak koleksiyondan da çıkarılmasını isteyebilirsiniz.

WeakSet ile Pratik Bir Örnek: Aktif Oturum Takibi

Bir web uygulamasında, o an aktif olan kullanıcı oturumlarını takip etmek isteyebilirsiniz. Her oturum bir nesne ile temsil edilsin.

[CODE]
let activeSessions = new WeakSet();

class Session {
constructor(sessionId) {
this.sessionId = sessionId;
this

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi