JavaScript үндэс / Symbol, WeakMap, WeakSet

Symbol, WeakMap, WeakSet

JavaScript-д байнга ашиглагдаагүй боловч мэргэшсэн хөгжүүлэгчийн бичсэн кодод заавал тохиолддог гурван төрөл байдаг: Symbol, WeakMap, WeakSet. Тэдгээрийг ойлгосноор бусдын кодыг уншиж ойлгох, сангийн баримт бичгийг унших чадвар эрс нэмэгдэнэ.

Symbol — цорын ганц түлхүүр

Symbol() дуудах бүрт дэлхийд давтагдашгүй утга үүсгэнэ. Ижил тайлбар өгсөн ч хоёр symbol хэзээ ч тэнцүү биш. Энэ нь объектын property-н нэр мөргөлдөхөөс сэргийлэхэд хэрэглэнэ.

javascript
const а = Symbol("id");
const б = Symbol("id");

console.log(а === б); // false — яг ижил боловч өөр!
console.log(typeof а); // "symbol"
console.log(а.toString()); // "Symbol(id)"

Symbol-ыг объектын нуугдмал property болгон ашиглаж болно. Энгийн for...in давталт эсвэл Object.keys() symbol-ыг харуулдаггүй:

javascript
const ID = Symbol("id");
const НЭР = Symbol("нэр");

const хэрэглэгч = {
  [ID]: "usr_001",
  [НЭР]: "Болд",
  нас: 24,
};

console.log(хэрэглэгч[ID]); // "usr_001"
console.log(хэрэглэгч[НЭР]); // "Болд"

for (const түлхүүр in хэрэглэгч) {
  console.log(түлхүүр); // зөвхөн "нас" — symbol харагдахгүй
}

WeakMap — санах ойд хүнд бус map

WeakMap нь энгийн Map-тай төстэй боловч нэг чухал ялгаатай: зөвхөн объект түлхүүр болж чадна, мөн тухайн объект өөр хаана ч ашиглагдахгүй болвол WeakMap дахь мэдээлэл нь автоматаар санах ойгоос арилна. Энэ нь санах ойн нэмэлт ачааллаас сэргийлдэг.

javascript
const weakMap = new WeakMap();

let элемент = { нэр: "Товч" };
weakMap.set(элемент, { дарагдсан: 0 });

console.log(weakMap.get(элемент)); // { дарагдсан: 0 }
console.log(weakMap.has(элемент)); // true

// элемент-ийн лавлагаа устгагдвал WeakMap-аас ч автоматаар арилна
элемент = null;

WeakMap нь size property эсвэл forEach, keys() методгүй — санаатайгаар хязгаарлагдсан:

javascript
// Бодит хэрэглээ: DOM элементтэй холбоотой өгөгдөл хадгалах
const товайруулалт = new WeakMap();

function товайруулах(элемент) {
  товайруулалт.set(элемент, { тоо: (товайруулалт.get(элемент)?.тоо ?? 0) + 1 });
}

const товч = document.querySelector("#товч");
товайруулах(товч);
console.log(товайруулалт.get(товч)); // { тоо: 1 }

WeakSet — давтагдашгүй объектын цуглуулга

WeakSet нь Set-тэй төстэй боловч зөвхөн объект хадгалах боломжтой, мөн WeakMap-ын нэгэн адил объект устгагдвал автоматаар цуглуулгаас хасагдана.

javascript
const боловсруулсан = new WeakSet();

function боловсруулах(объект) {
  if (боловсруулсан.has(объект)) {
    console.log("Аль хэдийн боловсруулсан — алгасав.");
    return;
  }
  // боловсруулах үйлдлийг хийнэ...
  боловсруулсан.add(объект);
  console.log("Боловсруулж дууслаа.");
}

const өгөгдөл = { нэр: "Тайлан А" };

боловсруулах(өгөгдөл); // Боловсруулж дууслаа.
боловсруулах(өгөгдөл); // Аль хэдийн боловсруулсан — алгасав.

Хэзээ ашиглах вэ?

javascript
// Symbol — property-н нэр мөргөлдөхөөс сэргийлэх, нуугдмал metadata
const ДҮРЭМ = Symbol("дүрэм");
массив[ДҮРЭМ] = "custom итератор";

// WeakMap — объекттэй холбоотой нуугдмал өгөгдөл (санах ой алдагдалгүй)
const кэш = new WeakMap();

// WeakSet — объект аль хэдийн боловсруулагдсаныг бүртгэх
const зочилсон = new WeakSet();

Эдгээр гурвыг өдөр бүр ашиглахгүй ч React, Vue зэрэг сангийн дотоод кодод байнга ашиглагддаг. Харсандаа гайхахаа болино!

Дараагийн хичээлд:

Тогтмол илэрхийлэл (RegExp) — текстэн дотроос загварт тохирох хэсгийг хэрхэн олох, шалгах, орлуулах талаар үзнэ.