JAVASCRIPT’IN TARIHÇESI
JavaScripte Neden Symbol Türüne İhtiyaç Duyuldu ?
JavaScript de veri türlerinden bahsetmiştik, ES6 ile birlikte primitive veri türlerinin içerisinde Symbol türü eklendi. Bu yazıda hangi ihtiyaçtan dolayı Symbol türüne ihtiyaç duyduğumuzu yazacağız.
--
Örnek olarak en çok kullandığımız React objelerinin içerisindeki typeof değişkeni Symbol olarak kullanılmıştır. Neden ?
Tabi öncelikle niye type değişkeni var iken birde $$typeof olduğunu merak edenler için onun linkini şuraya ekliyeyim → (Why Do React Elements Have a $$typeof Property?). Bu yazıyı okuduğunuzda Symbol veri tipinin kabaca güvenlik için kullanıldığını görebilirsiniz.
ES6 içerisinde Symbol diye bir tür geldi. Öncelikle JS içerisinde 2 tip türden bahsediyorduk, birincisi Primitive türler Immutable olanlar, birde Object türünde olan Object, Array, Function vb.. mutable yani içerikleri değiştirilebilen türler. (JS Veri Türleri) isminde bir yazı paylaşmıştım.
Burada önemli olan konu primitive türlerin içeriğinin değiştirilemez olması (immutable) olması. Diğer object türlerinde ise içeriği değiştirilebilen key/value string pair oluşması, yani (mutable) olması en önemli özelliğidir.
Objelerdeki bu key tanımları hep string olarak tanımlanır ve string yapıları üzerinden objeleri değiştirme esnekliği çok fazladır.
Örneğin Meta Progragramlama konseptleri altında anlattığım
Self-modification, Objeye yeni property atamak, tanımlamak veya varolan bir property silme işlemini Object[…] üzerinden gerçekleştirebiliyoruz. Aynen aşağıdaki örnekte görebileceğiniz gibi.. Mevcut Objenin yapısını istediğim gibi değiştirebiliyorum konusu.
Peki String dışında number veya boolean değerleri Objemizin key değeri olarak atayamıyor muyuz ?
Gördüğünüz gibi tanımlatmıyor. 2 sayısını key olarak beğenmedi.
Peki obj[2] desek bir tanımlama yapsak bu sefer kabul ediyor ama bunuda String değerine dönüştürüyor. Bu otomatik dönüştürme konusunu (Type Coercion ve Conversion) yazımda bulabilirsiniz.
Bu durumda biz objenin key değerlerini tanımlarken illa String vermemiz gerekiyor.
Burada farklı türde objelerin name diye bir key alanı olsada bunları birbirinden ayıran bir özellik yok..
Symbol aslında bize unique bir identifier sağlayan bir tiptir. Yani biz object keyleri için unique bir değer olsun başka değerler ile karışmasın istediğimizde string bunu sağlamaz.
Burda Symbol içerisindeki string parametresi ile bu oluşturulan Symbol nesnesinin description ve daha debuggable olması için kullanırız. Burada bu symbol boşta oluşturabilirdiniz.
Unique Key Oluşturma
Bunun yerine Symbollerden oluşan key değerler oluşturmanız gerekir.
Yukarıda her farklı tür obje içerisindeki key signiture(imzasını) uniqueleştirebilme imkanı bulmuş oldum. Buda object extensionları yaptığımızda birbirleri ile çakışma imkanı bulunmayan key değerleri üretebilmeyi olanaklı kılar.
Property (Key) Private Hale Getirme
Aşağıdaki ekran görüntüsünden de anlayabileceğiniz gibi Symbol olarak verilmiş key değerleri artık object.__ şeklinde erişebilirliğini kaybediyor.
2nci olarak user objesinin key elemanlarını almak istediğimizde burada iterate etmiyor.
Bu Bize Tam Bir Privacy Sağlar mı ?
Yani objeyi başka bir kütüphane üretti biz kullanıyoruz diyelim ki ? Burada bazı bilgileri bizden gizleyebilir mi ?
Sağlamaz siz başka komutlar ile Symbol property/key tanımlamalarını alabilirsiniz.
Peki Symbol Referanslarına Daha Kolay Bir Erişim Şekli Var mı ? (Global Symbol Registry)
Biz symbol referansları oluşturup bunları yönetmek için bir yerlere parametre olarak mı geçirerek kullanacağız ?
Bu referansları kullanmak için Global Registry kullanmak için Symbol.for() ile burdaki key parametresi olarak geçirilen değer için bir Symbol referansını Global Registry den döner.
Aynı şekilde Symbol.keyFor(symbol) ilerde key değerini alabiliriz. Bu sayede tek bir Global Symbol Registry üzerinden key, Symbol eşleşmesine ulaşabilirsiniz.
Enumaration Oluşturma
Const bir Enumaration Objesi oluşturdum ama bunu oluşturuyor olmam bu nesnenin içerisindeki enum değerlerini değiştirmemi engellemiyor..
Peki bunun için ne yapılabilir. Object.freeze ile object property değiştirmeyi dondurabiliriz.
Peki bizim bu status nesnesine Enum dışında bir değer atamamızı engelliyor mu ? Hayır engellemiyor. JS, type temelli bir yapıda olmadığı için TypeScript ve Flow transpiler yapılar kullanmanız gerekiyor aksi taktirde aşağıdaki gibi atama yapabilirsiniz.
Peki farklı enumların aynı value değerlerini almasını engelleyebiliyor mu ? Hayır ? Farklı Enumların farklı değerler alabilmesine engel değil.
İşte bu sorunu Symbol türü ile çözebiliriz. Aşağıdaki tanımlama Enumeration için daha doğru bir tanımlama olmuş olur, çünkü value değerlerini unique hale getirmiş oluyoruz.
Okumaya Devam Et 😃
Bu yazının devamı veya yazı grubundaki diğer yazılara (JS Pratik Kullanımı)erişmek için bu linke tıklayabilirsiniz.