Sembol

Browser Support

  • Chrome: 38.
  • Edge: 12.
  • Firefox: 36.
  • Safari: 9.

Source

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 simgeler
  • Symbol.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?

Evet
Hayır

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

JavaScript'in yerleşik yöntemlerine erişmek ve bu yöntemleri değiştirmek için benzersiz özellik anahtarları
"Symbol" nesnesinin statik özellikleri
Sık kullandığınız simgeler