JavaScript Symbols. Yashirin Xazina
JavaScript Symbol turiga chuqur nazar, uning xususiyatlari, ishlatilishi va amaliy misollari bilan
So'nggi yangilanish: 2024-12-24Bugun sizlar bilan JavaScript-ning eng qiziqarli va ko'pincha noto'g'ri tushunilgan xususiyatlaridan biri - Symbol haqida gaplashamiz. Symbol - bu JavaScript-ga ES6 (ECMAScript 2015) bilan qo'shilgan yangi ma'lumot turi. Keling, bu mavzuni chuqurroq o'rganib chiqaylik va Symbol-larning JavaScript dunyosidagi o'rnini tushunib olaylik.
Symbol nima?
Symbol - bu JavaScript-dagi noyob va o'zgarmas (immutable) primitive qiymat turidir. U obyekt xususiyatlari uchun noyob identifikator sifatida ishlatiladi. Symbol-lar yaratilganda har doim noyob bo'ladi, hatto bir xil tavsif bilan yaratilgan bo'lsa ham.
Keling, oddiy misol bilan boshlaymiz:
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false
const symbol3 = Symbol("tavsif");
const symbol4 = Symbol("tavsif");
console.log(symbol3 === symbol4); // false
Bu misolda, biz to'rtta Symbol yaratdik. symbol1
va symbol2
tavsifisiz, symbol3
va symbol4
esa "tavsif" tavsifi bilan yaratildi. Lekin, hatto bir xil tavsif bilan yaratilgan bo'lsa ham, har bir Symbol noyobdir.
Symbol-larni yaratish
Symbol-larni yaratishning bir necha usuli mavjud:
- Oddiy yaratish:
const oddiySymbol = Symbol();
- Tavsif bilan yaratish:
const tavsifliSymbol = Symbol("Bu Symbol uchun tavsif");
- Global Symbol registridan foydalanish:
const globalSymbol = Symbol.for("globalSymbolKaliti");
const birXilGlobalSymbol = Symbol.for("globalSymbolKaliti");
console.log(globalSymbol === birXilGlobalSymbol); // true
Symbol.for()
metodi global Symbol registridan foydalanadi. Agar berilgan kalit bilan Symbol mavjud bo'lmasa, u yangi Symbol yaratadi. Agar mavjud bo'lsa, mavjud Symbol-ni qaytaradi.
Symbol-larning xususiyatlari
- Noyoblik: Har bir Symbol noyobdir, hatto bir xil nom bilan yaratilgan bo'lsa ham.
- O'zgarmaslik: Symbol-lar o'zgarmas (immutable) hisoblanadi. Ularning qiymatini o'zgartirib bo'lmaydi.
- Yashirinlik: Symbol-lar odatda obyektning yashirin xususiyatlari uchun ishlatiladi.
- Tavsif: Symbol-lar tavsifga ega bo'lishi mumkin, lekin bu tavsif faqat debugging uchun ishlatiladi.
Symbol-larni amalda qo'llash
1. Yashirin xususiyatlar yaratish
Symbol-lar obyektlarda yashirin xususiyatlar yaratish uchun juda foydali:
const yashirinXususiyat = Symbol("yashirin");
const obyekt = {
ochiqXususiyat: "Bu hammaga ko'rinadi",
[yashirinXususiyat]: "Bu yashirin ma'lumot"
};
console.log(obyekt.ochiqXususiyat); // "Bu hammaga ko'rinadi"
console.log(obyekt[yashirinXususiyat]); // "Bu yashirin ma'lumot"
console.log(Object.keys(obyekt)); // ["ochiqXususiyat"]
console.log(JSON.stringify(obyekt)); // {"ochiqXususiyat":"Bu hammaga ko'rinadi"}
Bu misolda, yashirinXususiyat
Symbol-i obyektda yashirin xususiyat yaratish uchun ishlatildi. Bu xususiyat Object.keys()
yoki JSON.stringify()
kabi standart metodlar orqali ko'rinmaydi.
2. Enum-lar yaratish
Symbol-lar Enum-lar yaratish uchun ham juda qulay:
const Ranglar = {
QIZIL: Symbol("qizil"),
YASHIL: Symbol("yashil"),
KO'K: Symbol("ko'k")
};
function rangniTekshir(rang) {
switch(rang) {
case Ranglar.QIZIL:
return "Bu qizil rang";
case Ranglar.YASHIL:
return "Bu yashil rang";
case Ranglar.KO'K:
return "Bu ko'k rang";
default:
return "Noma'lum rang";
}
}
console.log(rangniTekshir(Ranglar.QIZIL)); // "Bu qizil rang"
console.log(rangniTekshir(Symbol("qizil"))); // "Noma'lum rang"
Bu misolda, biz Ranglar
obyektini yaratdik, uning har bir xususiyati noyob Symbol. Bu bizga xavfsiz va aniq Enum yaratish imkonini beradi.
3. Iteratorlar yaratish
Symbol-lar iteratorlar yaratish uchun ham ishlatiladi. Symbol.iterator
maxsus Symbol hisoblanadi:
const iteratsiyaQilinadiganObyekt = {
[Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}
};
for (let qiymat of iteratsiyaQilinadiganObyekt) {
console.log(qiymat);
}
// Natija:
// 1
// 2
// 3
Bu misolda, biz Symbol.iterator
yordamida oddiy obyektni iteratsiya qilinadigan obyektga aylantiridik.
Maxsus Symbol-lar
JavaScript bir nechta maxsus Symbol-larni taqdim etadi. Ular Symbol
obyektining statik xususiyatlari sifatida mavjud. Keling, ularning ba'zilarini ko'rib chiqaylik:
1. Symbol.iterator
Bu Symbol obyektlarni iteratsiya qilish uchun ishlatiladi. U for...of tsikli tomonidan chaqiriladi.
const massiv = [1, 2, 3];
const iterator = massiv[Symbol.iterator]();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
2. Symbol.toStringTag
Bu Symbol Object.prototype.toString()
metodi tomonidan obyekt turini aniqlash uchun ishlatiladi.
class MeningKlassim {
get [Symbol.toStringTag]() {
return "MeningKlassim";
}
}
const obyekt = new MeningKlassim();
console.log(Object.prototype.toString.call(obyekt)); // "[object MeningKlassim]"
3. Symbol.toPrimitive
Bu Symbol obyektni primitive qiymatga aylantirish uchun ishlatiladi.
const obyekt = {
[Symbol.toPrimitive](hint) {
if (hint === 'number') {
return 42;
}
if (hint === 'string') {
return 'Salom, dunyo!';
}
return true;
}
};
console.log(+obyekt); // 42
console.log(`${obyekt}`); // "Salom, dunyo!"
console.log(obyekt + ''); // "true"
Symbol-lar va xavfsizlik
Symbol-lar ma'lumotlarni yashirish va xavfsizlikni oshirish uchun ishlatilishi mumkin, lekin ular to'liq xavfsizlikni ta'minlamaydi. Masalan, Object.getOwnPropertySymbols()
metodi obyektning barcha Symbol xususiyatlarini qaytaradi:
const yashirinXususiyat = Symbol("yashirin");
const obyekt = {
[yashirinXususiyat]: "Yashirin ma'lumot"
};
const symbollar = Object.getOwnPropertySymbols(obyekt);
console.log(obyekt[symbollar[0]]); // "Yashirin ma'lumot"
Shuning uchun, Symbol-larni faqat oddiy yashirinlik uchun ishlatish kerak, lekin jiddiy xavfsizlik chorasi sifatida emas.
Symbol-lar va xotira
Symbol-lar garbage collection (axlat yig'ish) jarayonida boshqa primitive qiymatlar kabi ko'rib chiqiladi. Agar Symbol-ga hech qanday havola qolmasa, u xotiradan o'chiriladi.
Lekin, global Symbol registridagi Symbol-lar dastur ishlayotgan vaqt davomida xotirada saqlanib qoladi. Shuning uchun, Symbol.for()
metodini ehtiyotkorlik bilan ishlatish kerak.
let globalSymbol = Symbol.for("globalSymbol");
// globalSymbol hech qayerda ishlatilmasa ham, u xotirada qoladi
globalSymbol = null; // global registrdagi Symbol-ga ta'sir qilmaydi
Xulosa
Symbol-lar JavaScript-ning qiziqarli va kuchli xususiyatidir. Ular noyob identifikatorlar yaratish, yashirin xususiyatlar qo'shish va maxsus xatti-harakatlarni aniqlash uchun juda foydali. Symbol-larni to'g'ri ishlatish orqali siz o'z kodingizni yanada xavfsiz, aniq va moslashuvchan qilishingiz mumkin.
Lekin, har qanday kuchli vosita kabi, Symbol-larni ham ehtiyotkorlik bilan ishlatish kerak. Ularning noyoblik va yashirinlik xususiyatlarini hisobga olgan holda, qachon va qanday ishlatish kerakligini yaxshi tushunish muhim.
Symbol-larni o'rganish va amalda qo'llash orqali siz JavaScript-ning yanada chuqur imkoniyatlarini ochishingiz va o'z dasturlash mahoratingizni yangi bosqichga ko'tarishingiz mumkin.
Kod yozishda zavq oling, va Symbol-lar dunyosini kashf etishda omad tilayman!