Sembol

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?

Hayır
Evet

Aşağıdakilerden hangisi "iyi bilinen" sembolleri tanımlar?

"Sembol" nesnesinin statik özellikleri
Sık kullandığınız simgeler
JavaScript'lere erişmek ve bunları değiştirmek için benzersiz özellik anahtarları yerleşik yöntemler