Bu yazı hakkında Symbol()
bulabildiğim / yapabileceğim gerçek örnekler ve bulabildiğim gerçekler ve tanımlar ile ilgili.
TLDR;
Symbol()
ECMAScript'te 6 (ES6) ile birlikte tanıtılan bir veri türü vardır.
Sembol hakkında iki ilginç gerçek var.
ilk veri türü ve yalnızca JavaScript'te değişmez değeri olmayan veri türü
ile tanımlanan herhangi bir değişken Symbol()
benzersiz içerik alır, ancak gerçekten özel değildir .
herhangi bir verinin kendi Sembolü vardır ve aynı veriler için Semboller aynı olacaktır . Aşağıdaki paragrafta daha fazla bilgi, aksi takdirde bir TLRD değildir; :)
Sembolü nasıl başlatabilirim?
1. Hata ayıklanabilir bir değere sahip benzersiz bir tanımlayıcı almak için
Bunu şu şekilde yapabilirsiniz:
var mySymbol1 = Symbol();
Veya bu şekilde:
var mySymbol2 = Symbol("some text here");
"some text here"
Dize sembolü çıkarılan edilemez, bu hata ayıklama amacıyla sadece açıklaması bulunmaktadır. Sembolün davranışını hiçbir şekilde değiştirmez. Her ne kadar bunu yapabilirsiniz console.log
(bu, adil, çünkü değer günlüğe kaydetme içindir, bu günlüğü başka bir günlük girişi ile karıştırmamak için):
console.log(mySymbol2);
// Symbol(some text here)
2. Bazı dize verileri için bir sembol elde etmek
Bu durumda, sembolün değeri aslında dikkate alınır ve bu şekilde iki sembol benzersiz olmayabilir.
var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!
Bu sembollere "ikinci tip" sembolleri diyelim. Hiçbir şekilde "birinci tip" sembollerle (yani tanımlanmış olanlarla Symbol(data)
) kesişmezler .
Sonraki iki paragraf yalnızca ilk tür sembolüyle ilgilidir.
Eski veri türleri yerine Symbol kullanmaktan nasıl yararlanabilirim?
Önce bir nesneyi, standart bir veri türünü ele alalım. Orada bazı anahtar / değer çiftleri tanımlayabilir ve anahtarı belirterek değerlere erişebiliriz.
var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan
Ya Peter adında iki kişimiz varsa?
Bunu yapmak:
var persons = {"peter":"first", "peter":"pan"};
pek mantıklı değil.
Yani, aynı ada sahip iki farklı kişinin sorunu olduğu görülüyor. O zaman yeniye bakalım Symbol()
. Gerçek hayatta bir insan gibi - herhangi bir kişi benzersizdir , ancak adları eşit olabilir. İki "kişi" tanımlayalım.
var a = Symbol("peter");
var b = Symbol("peter");
Şimdi aynı isimli iki farklı kişimiz var. Kişilerimiz gerçekten farklı mı? Onlar; bunu kontrol edebilirsiniz:
console.log(a == b);
// false
Orada nasıl faydalanırız?
Nesnenizde farklı kişiler için iki giriş yapabiliriz ve hiçbir şekilde karıştırılamazlar.
var firstPerson = Symbol("peter");
var secondPerson = Symbol("peter");
var persons = {[firstPerson]:"first", [secondPerson]:"pan"};
Not:
Bununla birlikte, nesneyi dizmenin JSON.stringify
bir Sembol olarak başlatılan tüm çiftleri anahtar olarak bırakacağına dikkat etmek gerekir.
Yürütme Object.keys
de bu Symbol()->value
çiftleri döndürmez .
Bu başlatmayı kullanarak, birinci ve ikinci kişilerin girişlerini yanlış yapmak kesinlikle imkansızdır. console.log
Onları aramak , ikinci adlarını doğru şekilde verecektir.
console.log(persons[a]);
// first
console.log(persons[b]);
// pan
Nesnede kullanıldığında, numaralandırılamayan özelliklerin tanımlanmasına kıyasla farkı nedir?
Gerçekten de, gizlenecek bir mülkü Object.keys
ve numaralandırmayı tanımlamanın bir yolu zaten vardı . İşte burada:
var anObject = {};
var fruit = "apple";
Object.defineProperty( anObject, fruit, {
enumerable: false,
value: "green"
});
Ne fark eder Symbol()
ki? Aradaki fark, ile tanımlanan özelliği Object.defineProperty
normal şekilde elde edebilmenizdir:
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green
Ve önceki paragrafta olduğu gibi Symbol ile tanımlanırsa:
fruit = Symbol("apple");
Değerini yalnızca değişkenini biliyorsanız, yani
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined
Dahası, anahtarın altında başka bir özellik tanımlamak "apple"
, nesnenin eskisini düşürmesini sağlar (ve sabit kodlanmışsa bir hata verebilir). Artık elma yok! Ne yazık. Önceki paragrafa bakıldığında, Semboller benzersizdir ve bir anahtarı Symbol()
benzersiz hale getirecek şekilde tanımlar .
Tür dönüştürme ve denetleme
Diğer veri türlerinin aksine, Symbol()
herhangi bir veri türüne dönüştürmek imkansızdır .
İlkel veri türüne dayalı bir sembolü arayarak "yapmak" mümkündür Symbol(data)
.
Türü kontrol etmek açısından hiçbir şey değişmez.
function isSymbol ( variable ) {
return typeof someSymbol === "symbol";
}
var a_Symbol = Symbol("hey!");
var totally_Not_A_Symbol = "hey";
console.log(isSymbol(a_Symbol)); //true
console.log(isSymbol(totally_Not_A_Symbol)); //false