JavaScript Symbols. Yashirin Xazina

JavaScript Symbol turiga chuqur nazar, uning xususiyatlari, ishlatilishi va amaliy misollari bilan

So'nggi yangilanish: 2024-12-24

Bugun 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:

  1. Oddiy yaratish:
const oddiySymbol = Symbol();
  1. Tavsif bilan yaratish:
const tavsifliSymbol = Symbol("Bu Symbol uchun tavsif");
  1. 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

  1. Noyoblik: Har bir Symbol noyobdir, hatto bir xil nom bilan yaratilgan bo'lsa ham.
  2. O'zgarmaslik: Symbol-lar o'zgarmas (immutable) hisoblanadi. Ularning qiymatini o'zgartirib bo'lmaydi.
  3. Yashirinlik: Symbol-lar odatda obyektning yashirin xususiyatlari uchun ishlatiladi.
  4. 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!

Qo'shimcha manbalar

  1. MDN Web Docs: Symbol
  2. JavaScript.info: Symbol type
  3. ECMAScript 6 specification: Symbol Objects
  4. Exploring ES6: Symbols