Simge ilkel, diğer simge ilkellerinin değeri dahil olmak üzere hiçbir zaman başka bir değerle çakışmayan benzersiz bir değeri temsil eder. Aynı karakterlerden oluşan iki dize ilkel, kesinlikle eşit olarak değerlendirilir:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
Ancak Symbol()
işlevi kullanılarak oluşturulan hiçbir simge kesinlikle eşit olamaz:
Symbol() === Symbol()
> false
Bu özellik, bir nesnede benzersiz mülk anahtarları olarak semboller kullanmanıza olanak tanır. Böylece, başka bir kodun bu nesneye ekleyebileceği anahtarlarla çakışmaları önler.
const mySymbol = Symbol( "Desc" );
const myObject = {};
myObject[mySymbol] = "propSymbol";
myObject
> Object { Symbol("Desc"): "propSymbol" }
Üç tür simge vardır:
Symbol()
ile oluşturulan simgelerSymbol.for()
kullanılarak ayarlanan ve küresel bir simge sicil dairesinden alınan paylaşılan simgeler- Symbol nesnesinde statik özellikler olarak tanımlanan "tanınmış simgeler". Bu semboller, yanlışlıkla üzerine yazılamayan dahili yöntemler içerir.
Symbol()
, isteğe bağlı bir bağımsız değişken olarak açıklamayı (veya "simge adını") kabul eder.
Bu açıklamalar, hata ayıklama amacıyla kullanıcılar tarafından okunabilen etiketlerdir ve sonucun benzersizliğini etkilemez. Symbol
çağrısı, birden fazla çağrının açıklamaları aynı olsa bile tamamen benzersiz bir simge temel öğesi döndürür:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
Diğer ilkel veri türlerinde olduğu gibi, semboller de yöntemleri ve özellikleri prototiplerinden devralır. Örneğin, oluşturulan sembolün devralınan bir özelliği olarak bir açıklamaya erişebilirsiniz:
let mySymbol = Symbol( "My symbol." );
mySymbol.description
> "My symbol."
Ancak new
anahtar kelimesini kullanarak bir simge oluşturamazsınız:
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
Simgeler dizine eklenemez. Diğer bir deyişle, simgesel özellikler üzerinde iterasyon yapmak için standart yöntemler kullanıldığında bu özellikler kullanılamaz. getOwnPropertySymbols()
yöntemi, bir nesnenin simge özelliklerine erişim sağlar.
Paylaşılan semboller
Symbol.for()
yöntemi, çalışma zamanında geçerli olan genel bir simge kayıt defterinde mevcut simgelerin anahtar olarak belirli bir dizeyle aranmasını dener ve eşleşen bir simge bulunursa bu simgeyi döndürür. Böyle bir anahtar yoksa belirtilen anahtarla bir simge oluşturur ve bunu global sicile ekler:
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
Bu anahtarlar, yazar tarafından oluşturulan Symbol
primitiflerine atanan açıklamalarla işlevsel olarak örtüşmez. Simge sicilindeki bir sembole erişmek için önce for()
'ü kullanarak bu simgeyi oluşturmanız gerekir:
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol.for( "String" );
> false
Symbol.for( "String" ) === Symbol.for( "String" );
> true
Simge kayıt defterinden herhangi bir simgenin anahtarını almak için Symbol.keyFor()
simgesini kullanın:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
"Tanınmış" simgeler
Belirli semboller, Symbol
nesnesinin statik özellikleridir ve her biri bir simgedir. Bilinen semboller, JavaScript'in yerleşik yöntemlerine erişmek ve bu yöntemleri değiştirmek için benzersiz özellik anahtarları sağlarken temel davranışın yanlışlıkla üzerine yazılmasını önler.
Symbol;
> function Symbol()
asyncIterator: Symbol(Symbol.asyncIterator)
for: function for()
hasInstance: Symbol("Symbol.hasInstance")
isConcatSpreadable: Symbol("Symbol.isConcatSpreadable")
iterator: Symbol(Symbol.iterator)
keyFor: function keyFor()
length: 0
match: Symbol("Symbol.match")
matchAll: Symbol("Symbol.matchAll")
name: "Symbol"
prototype: Object { … }
replace: Symbol("Symbol.replace")
search: Symbol("Symbol.search")
species: Symbol("Symbol.species")
split: Symbol("Symbol.split")
toPrimitive: Symbol("Symbol.toPrimitive")
toStringTag: Symbol("Symbol.toStringTag")
unscopables: Symbol("Symbol.unscopables")
<prototype>: function ()
Semboller ES6'ya özgü bir özellik olduğundan bu sembolik değerlerin, geriye dönük uyumluluk sorunları oluşturmadan JavaScript'in davranışını değiştiren geliştiriciler için "uzantı noktası" olarak kullanılması amaçlanmıştır.
Bilinen simge değerleri, anahtarlarını değişken prototiplerinden ayırt etmek için genellikle @@
ön ekiyle stilize edilir veya %
içine alınır. Örneğin, @@match
(veya %match%
), String.prototype.match
yerine değişmez Symbol.match
değerine referans verir.
Öğrendiklerinizi test etme
Simge oluşturmak için new
simgesini kullanabiliyor musunuz?
Aşağıdakilerden hangisi "tanınmış" sembolleri tanımlar?