JavaScript-ում Symbol-ը
JavaScript-ում Symbol-ը: Հատուկ և յուրահատուկ արժեքներ։
JavaScript-ում Symbol-ը մի նոր primitive տիպ է (ներկայացվել է ES6-ում), որը ծառայում է որպես հատուկ և ունիկալ արժեք՝ հիմնականում օգտագործվում է որպես օբյեկտի բանալի (key), որը չպետք է համընկնի ուրիշ բանալիի հետ։
Այս հոդվածում կսովորենք․
Symbol-ը JavaScript-ում primitive տիպ է, ինչպես number, string, boolean և այլն։ Այն միշտ ստեղծում է ունիկալ արժեք, նույնիսկ եթե անունը նույնն է։
const sym1 = Symbol("id");
const sym2 = Symbol("id");
console.log(sym1 === sym2); // false
Այսինքն անգամ եթե երկու Symbol-ները ստեղծված են նույն "բնութագրով", դրանք տարբեր են։
const mySymbol = Symbol(); // առանց նկարագրության
const namedSymbol = Symbol("userId"); // նկարագրությամբ (debug-ի համար)
Նկարագրությունը չի ազդում արժեքի վրա, պարզապես օգնում է debug-ի ժամանակ։
Symbol-ները հիմնականում օգտագործվում են որպես բանալի, երբ չես ուզում, որ ուրիշները պատահմամբ վերագրեն կամ overwrite անեն այդ property-ն։
const ID = Symbol("id");
const user = {
name: "Ani",
[ID]: 12345,
};
console.log(user[ID]); // 12345
Ուշադրություն՝ եթե console.log անենք ամբողջ user օբյեկտը, Symbol-ով բանալիները չենք տեսնի։ Դրանք "թաքնված" են սովորական loop-երից։
for (let key in user) {
console.log(key); // name միայն
}
console.log(Object.keys(user)); // ["name"]
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(id)]
Եթե ուզում ես բացահայտել symobol-ով բանալիները, պետք է օգտագործես Object.getOwnPropertySymbols()։
Մինչև հիմա մենք տեսանք, որ Symbol("id") !== Symbol("id"), բայց կա ձև ստեղծել կրկնվող (shared) symobol-ներ՝ Symbol.for-ով։
const symA = Symbol.for("globalId");
const symB = Symbol.for("globalId");
console.log(symA === symB); // true
Այս կերպ բոլոր Symbol.for("globalId")-երը կվերադարձնեն նույն արժեքը։
JavaScript-ը ունի մի շարք նախապես սահմանված Symbol-ներ, որոնք կարելի է override անել հատուկ վարքի համար։
Ահա մի քանի օրինակ՝
Symbol | Նկարագրություն |
Symbol.iterator | Օգտագործվում է iterable դարձնելու համար (for...of) |
Symbol.toPrimitive | Հստակեցում, թե ինչպես symobol-ով օբյեկտը վերածել primititve-ի |
Symbol.toStringTag | Ճշտում Object.prototype.toString-ի արդյունքը |
Symbol.hasInstance | Վերահսկում instanceof |
Օրինակ՝ ստեղծենք iterable object՝
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
},
};
for (const num of myIterable) {
console.log(num); // 1, 2, 3
}
typeof-ով ստանում ենք 'symbol'։
typeof Symbol("test"); // "symbol"
Չենք կարող կոնկատինացիա անել
const s = Symbol("id");
console.log("My symbol is " + s); // TypeError
Պետք է հստակ վերածենք՝
console.log("My symbol is " + s.toString());