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 üçünString- Mətn üçünBoolean- Doğru/yalan dəyərlər üçünUndefined- Təyin olunmamış dəyərlər üçünNull- Qəsdən boş dəyər üçün
İndi biz BigInt və Symbol - xüsusi istifadə halları üçün nəzərdə tutulmuş iki xüsusi primitiv tipi öyrənəcəyik.
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.
// Ə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ış: 9007199254740994BigInt yaratmaq
BigInt yaratmağın iki yolu var: ədədin sonuna 'n' əlavə etmək və ya BigInt() funksiyasından istifadə etmək.
// 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ış: 123456789nBigInt əməliyyatları
BigInt adi rəqəmlərlə eyni arifmetik əməliyyatları dəstəkləyir.
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ış: trueBigInt məhdudiyyətləri
BigInt ilə işləyərkən bilməli olduğunuz bəzi vacib məhdudiyyətlər var.
// ❌ 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)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.
// 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'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.
// 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.
// 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ış: undefinedSymbol() və Symbol.for() arasında fərq
Symbol()- Həmişə yeni unikal Symbol yaradırSymbol.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.
// 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ətirSymbol.hasInstance- instanceof davranışını fərdiləşdirir
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
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.
// 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.
// 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ə
Təklifiniz var, səhv və ya xəta tapdınız? Zəhmət olmasa bizimlə əlaqə saxlayın.