javascriptde-symbol-tipi

Javascriptdə Symbol tipi

Javascriptdə(JS) 8 dəyişən tipindən biri Simvol(Symbol) adlanır. Digər tiplərin öyrənilməsi daha asan və sadə olmasına baxmayaraq, simvol(symbol) tipinin istifadə yerləri və yeni olması ilə bağlı bu tipin anlaşılmasında bəzi çətinliklər var. Bu məqaləmizdə həmin çətinliklərin öhdəsindən gəlməyə çalışacağıq.

               Symbol tipi ES6 standartında JS-ə əlavə olunan tipdir. Əsasən istifadəçi (developer) səviyyəsində obyekt üçün “private” member (gizli üzv) hazırlayan zaman istifadə edirik. Göründüyü kimi, private sözünü xüsusi olaraq dırnaqda qeyd etmişik, çünki bu tip bizə digər OOP dillərində olduğu kimi original private member  yaratmağa imkan vermir.  İstifadə yerinə keçməzdən əvvəl ilk öncə tipin özüylə texniki səviyyədə tanış olaq.


               Simvol primitiv tipdir və adəti üzrə unikal identifikator formalaşdırmaq üçündür. Bu bir sıra digər dillərdəki uniqueidentifier, GUİD anlayışları ilə müqayisə oluna bilər. Məqsəd unikal bir “açar” verərək onu xüsusən məhdud çərçivədə görünən xarakteristika(property), metod yaratmaq üçün istifadə etməkdir.

Bir çox tiplərdən fərqli olaraq, simvol tipində dəyişən yaratmaq üçün new açar sözünə ehtiyac  yoxdur. Symbol adlanan funksiya-konstruktorumuz geriyə yeni simvol obyekti qayrarır.

              let symbol = Symbol();

 Simvol tipində dəyişən yaradarkən verilməsi məcbur olmayan arqument ilə bu tipə description yarada bilərik.

     let symbol = Symbol("desc");
     console.log(symbol.description);

Description burada hansısa bir məna ifadə etmir. Onu vermədən də bu tipdə dəyişən yaratmaq və sərbəst istifadə etmək mümkündür.


Simvol tipini digər əksər dəyişənlərlə müqayisə etsək bu cür fərqlərlə rastlaşa bilərik:

              

1)Digər bir çox tiplərdən fərqli olaraq 2 simvol tipi , hətta description-ları bərabər olsa da bir-birinə bərabər olmurlar. (Obyekt və massivlərdəki kimi)

               Symbol(“a”) == Symbol(“a”) // false qaytaracaq, çünki 2 simvol bir birinə bərabər deyil!

2)Digər tiplərdən fərqli olaraq simvol tipinin toString() metodu arxa planda avtomatik olaraq çağrılmır.

         let a = 67;
         alert(a); // kod işləyir çünki arxa planda a.toString() çağrılır

Amma ki

let s = Symbol();
alert(s); // kod işləmir, çünki toString() avtomatik çağrılmır!!
alert(s.toString()); // gərək manual qaydada yazasan

Symbol tipinin bucür hərəkət formasına malik olmasanın əsas səbəbi string tipi ilə konflikt verməsinin qarşısını almaqdır.

İndi isə Symbol(simvol) tipinin istifadə yerlərinə baxaq:

1)     Simvol tipi adətən “private” member(gizli obyekt üzvü) yaradan zaman istifadə edirik.

Gəlin məsələni sizə sadə formada izah edim. Adətən JS ilə app hazırlayan zaman development vaxtı istifadə etdiyimiz bir çox obyektlər ya 3rd party olur, ya da komandanın digər üzvləri tərəfindən yaradılmış olur ki, həmin obyektə bəzən biz də öz əlavələrimizi etməli oluruq. Belə əlavələr zamanı original obyektdə hansısa bir üzvü bilmədən dəyişmək riskimiz var. Simvol tipi həmin riski aradan qaldırır. Gəlin sadə bir obyektin lifecycle-na baxaq

PS: koda yazılan qeydləri diqqətlə oxuyun

 //ilk öncə obyekt bu formada idi
      let person = {
        Id34,
        age17,
        name"Midoriya",
        nurname"Izuku",
        getFullInfofunction() {
          return `${this.name} ${this.surname}`;
        }
      };


      // daha sonra obyekt bizim görünm sahəsinə düşəndə biz də obyektin daxilinə baxmadan oraya funksiya əlavə etmək istəyirik
      //amma bu əlavənin ancaq bizim konteksdə görünməsini istəyirik, açarının bizdə olmasını istəyirik
      //lakin aşağıdakı kimi bir kod mövcud funksiyanı override edir, köhnə kodu itiririk....


      let funcname = "getFullInfo";
      person[funcname] = function() {
        return `Hello. My name is ${this.name}, surname  ${this.surname} and my age is ${this.age}`;
      };

Yuxaırdakı kod nümunəsində original obyektdə olan istər dəyişən (obyektdəki ilə eyni) , istər metod adı ilə eyni olan üzvü əlavə etmək istədikdə mövcud obyektdəki üzv override olunur. Lakim original obyektdəki üzvləri dəyişmədən, oraya “eyniadlı” üzv , və ya original obyektə sadəcə bizimçün görünən üzv necə əlavə edə bilərik ki, original obyektin axıçına təsir etməsin? Bax verilməli olan sual budur. Bu sualın cavabı isə Simvol tipidir!

 //simvol istifadə edək..
      let s_funcname = Symbol("getFullInfo");


      person[s_funcname] = function() {
        return `Hello. My name is ${this.name}, surname  ${this.surname} and my age is ${this.age}`;
      };


      //indi original obyektin daxilinə baxaq. chrome console ilə

 

Təəssüf ki, symbol tipi göründüyü kimi private member yaratmağa tam da imkan vermir. Çünki misalçün Object.getOwnPropertySymbols(obj) metodu obyektin daxilindəki bütün symbolları almaq olur. Bunu bir növ refleksiya metodu kimi görə bilərik. Amma işin yaxşı tərəfi odur ki, development vaxtı bu metodu demək olar ki, nadir hallarda istifadə edirik. Adətən obyektdə dövr üçün for ..of istifadə edirik, bu zaman isə obyektin symbolları görünmür!!!

2)JS öz build-in behaviour-ları üçün istifadə edir.

               Amma əgər qlobal xarakterli simvollar istifadə etmək istəyirisinizsə ozaman Symbol.for() istifadə edə bilərsiniz. Bu zaman eyni description-ı olan iki simvol bir birinə bərabər sayılacaq.

Yekun icmal:

-Simvol primitiv tipdir və unikal identifikator xarakteri daşıyır.

-Obyektdə başqa original üzvlərlə(metod və ya property) ilə qarışmasını istəmədiyimiz üzv yaradan zaman istifadə olunur.

-JS öz daxili interpretasiya prosesində bu tipi çox istifadə edir.


Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz