Symbol, WeakMap, WeakSet
JavaScript-д байнга ашиглагдаагүй боловч мэргэшсэн хөгжүүлэгчийн бичсэн кодод заавал тохиолддог гурван төрөл байдаг: Symbol, WeakMap, WeakSet. Тэдгээрийг ойлгосноор бусдын кодыг уншиж ойлгох, сангийн баримт бичгийг унших чадвар эрс нэмэгдэнэ.
Symbol — цорын ганц түлхүүр
Symbol() дуудах бүрт дэлхийд давтагдашгүй утга үүсгэнэ. Ижил тайлбар өгсөн ч хоёр symbol хэзээ ч тэнцүү биш. Энэ нь объектын property-н нэр мөргөлдөхөөс сэргийлэхэд хэрэглэнэ.
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-ыг харуулдаггүй:
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 дахь мэдээлэл нь автоматаар санах ойгоос арилна. Энэ нь санах ойн нэмэлт ачааллаас сэргийлдэг.
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() методгүй — санаатайгаар хязгаарлагдсан:
// Бодит хэрэглээ: DOM элементтэй холбоотой өгөгдөл хадгалах
const товайруулалт = new WeakMap();
function товайруулах(элемент) {
товайруулалт.set(элемент, { тоо: (товайруулалт.get(элемент)?.тоо ?? 0) + 1 });
}
const товч = document.querySelector("#товч");
товайруулах(товч);
console.log(товайруулалт.get(товч)); // { тоо: 1 }
WeakSet — давтагдашгүй объектын цуглуулга
WeakSet нь Set-тэй төстэй боловч зөвхөн объект хадгалах боломжтой, мөн WeakMap-ын нэгэн адил объект устгагдвал автоматаар цуглуулгаас хасагдана.
const боловсруулсан = new WeakSet();
function боловсруулах(объект) {
if (боловсруулсан.has(объект)) {
console.log("Аль хэдийн боловсруулсан — алгасав.");
return;
}
// боловсруулах үйлдлийг хийнэ...
боловсруулсан.add(объект);
console.log("Боловсруулж дууслаа.");
}
const өгөгдөл = { нэр: "Тайлан А" };
боловсруулах(өгөгдөл); // Боловсруулж дууслаа.
боловсруулах(өгөгдөл); // Аль хэдийн боловсруулсан — алгасав.
Хэзээ ашиглах вэ?
// Symbol — property-н нэр мөргөлдөхөөс сэргийлэх, нуугдмал metadata
const ДҮРЭМ = Symbol("дүрэм");
массив[ДҮРЭМ] = "custom итератор";
// WeakMap — объекттэй холбоотой нуугдмал өгөгдөл (санах ой алдагдалгүй)
const кэш = new WeakMap();
// WeakSet — объект аль хэдийн боловсруулагдсаныг бүртгэх
const зочилсон = new WeakSet();
Эдгээр гурвыг өдөр бүр ашиглахгүй ч React, Vue зэрэг сангийн дотоод кодод байнга ашиглагддаг. Харсандаа гайхахаа болино!
Дараагийн хичээлд:
Тогтмол илэрхийлэл (RegExp) — текстэн дотроос загварт тохирох хэсгийг хэрхэн олох, шалгах, орлуулах талаар үзнэ.