Dərs 12 Orta səviyyə

JavaScript-də xüsusi primitivlər

BigInt və Symbol kimi nadir, lakin güclü primitiv tiplərini öyrənin

Nələri öyrənəcəksiniz

  • BigInt nədir və çox böyük ədədlərlə necə işləməyi başa düşəcəksiniz
  • Symbol tipini və unikal identifikatorlar yaratmağı öyrənəcəksiniz
  • Xüsusi primitivləri nə zaman və necə istifadə edəcəyinizi biləcəksiniz
  • Bu xüsusi tiplərin məhdudiyyətlərini və uyğunluğunu başa düşəcəksiniz

01 Xüsusi primitivlərə giriş

JavaScript-in beş əsas primitiv tipi var: Number, String, Boolean, Undefined və Null. Ancaq müasir JavaScript-də iki xüsusi primitiv tip də var ki, bunlar xüsusi istifadə halları üçün nəzərdə tutulub.

Əsas primitivlərə qısa baxış

  • Number - Rəqəmlər üçün
  • String - Mətn üçün
  • Boolean - Doğru/yalan dəyərlər üçün
  • Undefined - Təyin olunmamış dəyərlər üçün
  • Null - Qəsdən boş dəyər üçün

İndi biz BigIntSymbol - xüsusi istifadə halları üçün nəzərdə tutulmuş iki xüsusi primitiv tipi öyrənəcəyik.

Əhəmiyyətli qeydBu xüsusi primitivlər müasir JavaScript-ə sonradan əlavə olunub və hər yerdə istifadə edilmir. Ancaq spesifik problemləri həll etdikdə çox faydalıdırlar.

02 BigInt - böyük tam ədədlər

BigInt JavaScript-də istənilən ölçüdə tam ədədlərlə işləməyə imkan verən rəqəmsal primitiv tipdir. Bu, adi Number tipinin təhlükəsiz ölçü məhdudiyyətindən kənara çıxmağa imkan verir.

Number tipi ilə problem

JavaScript-in adi Number tipi 64-bit qoşa dəqiqlikli şəkildə formatlanmış ədədlərdən istifadə edir, bu da tam ədədləri təhlükəsiz şəkildə -2⁵³-1 ilə 2⁵³-1 arasında təmsil edə bilir.

javascript
// Ən böyük təhlükəsiz tam ədəd
console.log(Number.MAX_SAFE_INTEGER);
// Çıxış: 9007199254740991

// Təhlükəsiz tam ədəd həddindən kənarda problem
let bigNum = 9007199254740992;
console.log(bigNum);           // Çıxış: 9007199254740992
console.log(bigNum + 1);       // Çıxış: 9007199254740992 (səhv!)
console.log(bigNum + 2);       // Çıxış: 9007199254740994
ProblemBu həddən kənara çıxdıqda, JavaScript dəqiqliyi itirir və səhv nəticələr verir. Bu, maliyyə hesablamaları, kriptoqrafiya və ya böyük identifikatorlarla işləyərkən ciddi problemlərə səbəb ola bilər.

BigInt yaratmaq

BigInt yaratmağın iki yolu var: ədədin sonuna 'n' əlavə etmək və ya BigInt() funksiyasından istifadə etmək.

javascript
// Metod 1: 'n' suffiksi
let big1 = 1234567890123456789012345678901234567890n;
console.log(big1);
console.log(typeof big1);      // Çıxış: 'bigint'

// Metod 2: BigInt() funksiyası
let big2 = BigInt("1234567890123456789012345678901234567890");
console.log(big2);

// Metod 3: Adi ədəddən çevrilmə
let big3 = BigInt(123456789);
console.log(big3);             // Çıxış: 123456789n

BigInt əməliyyatları

BigInt adi rəqəmlərlə eyni arifmetik əməliyyatları dəstəkləyir.

javascript
let a = 10n;
let b = 3n;

console.log(a + b);            // Çıxış: 13n
console.log(a - b);            // Çıxış: 7n
console.log(a * b);            // Çıxış: 30n
console.log(a / b);            // Çıxış: 3n (tam ədəd bölməsi)
console.log(a % b);            // Çıxış: 1n
console.log(a ** b);           // Çıxış: 1000n

// Müqayisə əməliyyatları işləyir
console.log(10n > 5n);         // Çıxış: true
console.log(10n === 10n);      // Çıxış: true

BigInt məhdudiyyətləri

BigInt ilə işləyərkən bilməli olduğunuz bəzi vacib məhdudiyyətlər var.

javascript
// ❌ BigInt və Number-i qarışdıra bilməzsiniz
let result = 10n + 5;          // TypeError

// ✅ Əvvəlcə çevirməlisiniz
let result1 = 10n + BigInt(5); // Çıxış: 15n
let result2 = Number(10n) + 5; // Çıxış: 15

// ❌ Math metodları BigInt ilə işləmir
Math.sqrt(16n);                // TypeError

// Sərbəst müqayisə (==) işləyir
console.log(10n == 10);        // Çıxış: true (tip çevrilməsi)
console.log(10n === 10);       // Çıxış: false (fərqli tiplər)
Vacib məhdudiyyətBigInt və Number-i qarışdıra bilməzsiniz. Onları əməliyyatlardan əvvəl açıq şəkildə çevirməlisiniz.

BigInt-in istifadə halları

  • Kriptoqrafiya - böyük sadə ədədlər və açarlarla işləmək
  • Maliyyə - dəqiq pul hesablamaları üçün
  • Mikrosaniyə dəqiqliyi ilə timestamp-lər
  • Verilənlər bazasında böyük ID-lər (məsələn, Twitter-in 64-bit tweet ID-ləri)
  • Elmi hesablamalar - faktoriallar, kombinatorika

03 Symbol - unikal identifikatorlar

Symbol tamamilə unikal identifikator yaratmaq üçün xüsusi primitiv tipdir. Hər Symbol dəyəri tamamilə unikaldır və dəyişməzdir.

Symbol yaratmaq

Symbol() funksiyasından istifadə edərək Symbol yaradırsınız. İstəyə bağlı olaraq debug üçün təsvir əlavə edə bilərsiniz.

javascript
// Hər Symbol unikaldır
let sym1 = Symbol();
let sym2 = Symbol();

console.log(sym1 === sym2);    // Çıxış: false (həmişə fərqli)

// İstəyə bağlı təsvirlə Symbol
let userId = Symbol('id');
console.log(userId.description); // Çıxış: 'id'
console.log(typeof userId);      // Çıxış: 'symbol'
Vacib xüsusiyyətEyni təsvirlə belə hər Symbol tamamilə unikaldır. Təsvir yalnız debug məqsədilə istifadə olunur və Symbol-un identifikatorunun bir hissəsi deyil.

Obyekt açarları kimi Symbol-lar

Symbol-ların əsas istifadə hallarından biri obyekt xassələri üçün unikal açarlar yaratmaqdır ki, təsadüfən üzərinə yazılmasın.

javascript
// Symbol obyekt xassəsi kimi
let id = Symbol('id');
let user = {
  name: 'Alice',
  age: 30,
  [id]: 12345
};

console.log(user[id]);         // Çıxış: 12345

// Symbol-lar adi iterasiyada görünmür
for (let key in user) {
  console.log(key);            // Çıxış: 'name', 'age' (Symbol yoxdur)
}

console.log(Object.keys(user)); // Çıxış: ['name', 'age']

// Symbol xassələrini əldə etmək üçün
console.log(Object.getOwnPropertySymbols(user)); // Çıxış: [Symbol(id)]

Qlobal Symbol registrləri

Bəzən eyni Symbol-a kodunuzun müxtəlif hissələrindən daxil olmaq lazımdır. Bunun üçün qlobal Symbol registrindən istifadə edə bilərsiniz.

javascript
// Qlobal registrdən eyni Symbol-u əldə etmək
let sym1 = Symbol.for('app.id');
let sym2 = Symbol.for('app.id');

console.log(sym1 === sym2);    // Çıxış: true (eyni Symbol)

// Symbol üçün açarı əldə etmək
console.log(Symbol.keyFor(sym1)); // Çıxış: 'app.id'

// Qlobal olmayan Symbol
let localSym = Symbol('test');
console.log(Symbol.keyFor(localSym)); // Çıxış: undefined

Symbol() və Symbol.for() arasında fərq

  • Symbol() - Həmişə yeni unikal Symbol yaradır
  • Symbol.for() - Qlobal registrdə mövcud Symbol-u axtarır və ya yenisini yaradır

Məşhur Symbol-lar

JavaScript-in dilin davranışını dəyişdirmək üçün istifadə edə biləcəyiniz daxili Symbol-ları var. Bunlara 'məşhur Symbol-lar' deyilir.

javascript
// Symbol.iterator ilə xüsusi iterativ
let range = {
  from: 1,
  to: 5,

  [Symbol.iterator]() {
    let current = this.from;
    let last = this.to;

    return {
      next() {
        if (current <= last) {
          return { value: current++, done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};

// İndi for...of loop-da istifadə edə bilərik
for (let num of range) {
  console.log(num);            // Çıxış: 1, 2, 3, 4, 5
}

Ən çox istifadə olunan məşhur Symbol-lar

  • Symbol.iterator - Obyekti iterasiya edilə bilən edir (for...of)
  • Symbol.toStringTag - Object.prototype.toString() üçün əlavə sətir
  • Symbol.hasInstance - instanceof davranışını fərdiləşdirir
İrəli səviyyə mövzuMəşhur Symbol-lar meta-proqramlaşdırma üçündür və daha irəli səviyyə mövzularda əhatə olunacaq. İndilik onların mövcud olduğunu bilmək kifayətdir.

Symbol-un istifadə halları

  • Obyekt xassələri üçün unikal açarlar yaratmaq
  • Xüsusi davranışlar üçün gizli obyekt metadata-sı
  • Proqramlaşdırma interfeysləri vasitəsilə ad toqquşmalarının qarşısını almaq
  • Meta-proqramlaşdırma və obyekt davranışını fərdiləşdirmə

04 Xüsusi primitivlərdən nə zaman istifadə etməli

Bu xüsusi primitivlərin hər ikisi güclü olsa da, hər gün istifadə olunmur. Onlardan nə zaman istifadə edəcəyinizi bilmək vacibdir.

BigInt-dən nə zaman istifadə etməli

BigInt-dən istifadə edin:

  • 2⁵³-1-dən (9,007,199,254,740,991) böyük ədədlərlə işləyərkən
  • Tam ədəd hesablamalarda dəqiqlik çox vacib olduqda
  • Kriptoqrafiya, maliyyə və ya böyük ID-lərlə işləyərkən

BigInt-dən istifadə etməyin:

  • Adi rəqəm intervalında (±9 trilyon) olan hesablamalar üçün
  • Ondalıq/float hesablamalar lazım olduqda
  • Performans kritik olduqda (BigInt Number-dən daha yavaşdır)

Symbol-dan nə zaman istifadə etməli

Symbol-dan istifadə edin:

  • Obyekt xassələri üçün həqiqətən unikal identifikatorlar lazım olduqda
  • Gizli/xüsusi obyekt metadata-sı yaratdıqda
  • Kitabxana/framework yaradıb ad toqquşmalarının qarşısını almaq istədikdə

Symbol-dan istifadə etməyin:

  • Adi obyekt açarları üçün (sadə sətirlərdən istifadə edin)
  • Dəyəri JSON-a serialize etmək lazım olduqda
  • Açarları Object.keys() və ya for...in ilə iterasiya etmək lazım olduqda

05 Uyğunluq və dəstək

Xüsusi primitivlər müasir JavaScript xüsusiyyətləridir və əsas JavaScript-in bir hissəsi olduğundan brauzer uyğunluğunu yoxlamaq vacibdir.

Brauzerdə dəstək

  • BigInt: ES2020-dən başlayaraq dəstəklənir. Bütün müasir brauzerlər dəstəkləyir (Chrome 67+, Firefox 68+, Safari 14+, Edge 79+)
  • Symbol: ES2015 (ES6)-dan başlayaraq dəstəklənir. Praktiki olaraq bütün müasir brauzerlər dəstəkləyir
Praktik məsləhətÇox köhnə brauzerləri (IE11 kimi) dəstəkləmək lazımdırsa, bu xüsusiyyətləri polyfill etmək çətin ola bilər. Belə hallarda, adi Number və String-dən istifadə edərək alternativ həll yolları düşünün.

06 Praktik nümunələr

Gəlin bu xüsusi primitivlərin real dünya ssenarilərində necə istifadə oluna biləcəyinə baxaq.

BigInt nümunəsi: Böyük ədədlərin faktorialı

Adi Number tipi ilə faktorial sürətlə dəqiqliyi itirir, ancaq BigInt böyük nəticələri idarə edə bilir.

javascript
// Böyük ədədlərin faktorialını hesabla
function factorial(n) {
  if (n === 0n || n === 1n) {
    return 1n;
  }
  return n * factorial(n - 1n);
}

console.log(factorial(20n));   // Çıxış: 2432902008176640000n
console.log(factorial(50n));   // çox böyük ədəd!

Symbol nümunəsi: Gizli xassələr

Symbol-lardan obyektdə gizli xassələr yaratmaq üçün istifadə edə bilərsiniz ki, adi iterasiya zamanı görünməsin.

javascript
// Symbol ilə xüsusi xassə
const _radius = Symbol('radius');

class Circle {
  constructor(radius) {
    this[_radius] = radius;
  }

  getArea() {
    return Math.PI * this[_radius] ** 2;
  }

  getRadius() {
    return this[_radius];
  }
}

let circle = new Circle(5);
console.log(circle.getArea());       // Çıxış: 78.53981633974483
console.log(circle[_radius]);        // Çıxış: undefined (xaricdən daxil olmaq olmur)
console.log(Object.keys(circle));    // Çıxış: []

Xülasə

BigInt istənilən ölçüdə tam ədədlərlə işləməyə imkan verir, Number-in 2⁵³-1 həddini aşaraq
BigInt yaratmaq üçün 'n' suffiksindən (123n) və ya BigInt() funksiyasından istifadə edin
Symbol tamamilə unikal və dəyişməz identifikatorlar yaradır
Symbol-lar obyektdə gizli xassələr və unikal açarlar üçün mükəmməldir
Hər iki tip xüsusi istifadə halları üçündür və gündəlik proqramlaşdırmada hər zaman lazım deyil

Təklifiniz var, səhv və ya xəta tapdınız? Zəhmət olmasa bizimlə əlaqə saxlayın.