Semboller nispeten yeni ilkel elemanlardan yararlanırız. Semboller ilke, benzersiz bir değeri temsil eder hiçbir zaman, diğer temel simge öğelerininkiler de dahil olmak üzere başka herhangi bir değerle çakışmaz. Aynı karakterlerden oluşan iki temel dize kesin olarak değerlendirilir eşittir:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
Ancak Symbol()
işlevi kullanılarak oluşturulan hiçbir sembol
kesinlikle eşit:
Symbol() === Symbol()
> false
Bu özellik, simgeleri bir nesnede benzersiz özellik anahtarları olarak kullanmanızı sağlar. çakışmaları o nesneye neden olabilir.
const mySymbol = Symbol( "Desc" );
const myObject = {
}
myObject
> Object { Symbol("Desc"): "propSymbol" }
Üç tür simge vardır:
Symbol()
ile oluşturulan semboller-
Symbol.for()
. - "İyi bilinen simgeler" statik özellikler olarak tanımlanır. Bu semboller, yanlışlıkla üzerine yazılamayan dahili yöntemler içerir.
Symbol()
, açıklamayı (veya "simge adını") isteğe bağlı bağımsız değişken olarak kabul eder.
Bu açıklamalar, hata ayıklama amacıyla kullanıcıların okuyabileceği etiketlerdir ve
sonucun benzersizliğini etkilemez. Symbol
öğesine yapılan tüm çağrılar
birden fazla çağrı aynı olsa bile tamamen benzersiz sembol temel öğesi
açıklamalar:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
Diğer temel veri türlerinde olduğu gibi simgeler prototiplerini. Örneğin, oluşturulan simgenin 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 simge oluşturamazsınız:
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
Semboller numaralandırılamaz. Diğer bir deyişle, sembolik özellikler kullanılamaz
standart yöntemler kullanarak bunları yinelemek için kullanabilirsiniz. getOwnPropertySymbols()
yöntemi, bir nesnenin sembol özelliklerine erişim sağlar.
Paylaşılan simgeler
Symbol.for()
yöntemi, tablodaki mevcut simgeleri
anahtar olarak belirli bir dizeyle çalışma zamanı genelinde genel simge kaydı ve
eşleşen simgeyi de gösterir. Böyle bir etiket bulamazsa bir simge oluşturur
belirtilen anahtarla değiştirilir ve genel kayıt defterine eklenir:
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
Bu anahtarların, kullanıcıya atanan açıklamalarla işlevsel olarak örtüşmemesi
yazar tarafından oluşturulan Symbol
temel öğeler. Sembol kaydındaki bir simgeye erişmek için
önce for()
ile oluşturmanız gerekir:
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol().for( "String" );
> false
Symbol().for( "String" ) === Symbol().for( "String" );
> true
Sembol kaydından herhangi bir sembolün anahtarını almak için
Symbol.keyFor()
:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
"Ünlü" simgeler
İyi bilinen simgeler, Symbol
nesnesinin statik özellikleridir. Bu özelliklerin her biri
bir simgedir. İyi bilinen simgeler, işletmeniz için benzersiz özellik anahtarları sağlar.
JavaScript'in yerleşik yöntemlerine erişme ve bunları değiştirme, ancak çekirdek
yanlışlıkla üzerine yazılmasını engeller.
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ğerler "uzatma noktaları" olarak kullanılması amaçlanmıştır JavaScript'in öncekinden daha farklı şekilde çalışır.
İyi bilinen sembol değerleri genellikle
@@
öneki veya %
aralığına sarmalanmış:
anahtarlarını değişebilir prototiplerinden ayırt edebiliyorlar. Örneğin, @@match
(veya %match%
), sabit Symbol.match
öğesine referanstır,
String.prototype.match
.
Öğrendiklerinizi sınayın
Sembol oluşturmak için new
kullanılabilir mi?
Aşağıdakilerden hangisi "iyi bilinen" sembolleri tanımlar?