Özet - Symbol
Symbol kullanarak bir nesneye for...in'de görünmeyen özel bir özellik eklersin.
Özet: Symbol
Symbol, JavaScript'in yedinci primitive türüdür: benzersiz, değişmez ve for...in'den gizli. Symbol() her çağrıda yeni bir değer üretir; Symbol.for() ise global kayıt üzerinden paylaşır.
Well-known semboller (Symbol.iterator, Symbol.toPrimitive, Symbol.toStringTag) dilin davranışına kanca atar. Sembol anahtarlar iç meta veri ve enum kategorileri için idealdir; çünkü dize anahtarlarla çakışmaz.
Ne zaman symbol kullanmalısın?
Sembol kullanmanın üç temel nedeni vardır: (1) yanlışlıkla çakışamayacak benzersiz değerler (enum kategorileri), (2) tam kontrolün olmadığı nesnelere meta veri ekleme (kütüphaneler), (3) dil davranışına kanca atma (well-known semboller).
Genel nesne özellikleri için sembol kullanma; hata ayıklamayı zorlaştırır ve serileştirmede kaybolur. Sembol, özel bir amaca hizmet ettiğinde parlar.
Uygulama Eklenti güvenli meta veri ekle
internal adında bir sembol oluştur. cache nesnesine count: 0 dize anahtarını ve [internal]: { ttl: 60 } sembol anahtarını ekle. for...in ile cache'i gez ve dize anahtarlarını yazdır. Sonra sembol anahtarlarını toplayıp yazdır.
Örnek çözümü göster
const internal = Symbol('internal');
const cache = {
count: 0,
[internal]: { ttl: 60 }
};
for (let key in cache) {
console.log(key);
}
console.log(Object.getOwnPropertySymbols(cache));
Kendini test et
-
Bir kütüphane, kullanıcının nesnesine gizli meta veri eklemek istiyor. En güvenli yol hangisidir?
- Dize anahtar kullanır; for...in'de görünür
- Aynı isimde dize anahtar kullanır; çakışma riski var
- Symbol anahtar kullanır; for...in'de gizli kalır
- Prototype'a dize ekler
Cevabı göster
Symbol anahtar kullanır; for...in'de gizli kalır — Doğru. Sembol anahtarlar for...in ve Object.keys'ten gizli kalır; isim çakışması olmaz.
-
Paylaşılan sembolle eşitlik göster
const shared = ____; const other = Symbol.for('shared'); console.log(shared === other);Cevabı göster
const shared = Symbol.for('shared'); const other = Symbol.for('shared'); console.log(shared === other);