Symbol turi
Spetsifikatsiyaga ko'ra obyekt xossalarining kaliti faqat ikki turdan biri bo'la oladi: satr (string) yoki Symbol. Bu darsda ikkinchisi โ noyob identifikatorlar yaratuvchi Symbol turi bilan tanishamiz.
Symbol nima?
Symbol โ "noyob identifikator"ni ifodalovchi primitiv tur. Uni Symbol() funksiyasi bilan yaratamiz. Ixtiyoriy tavsif (nom) berishimiz mumkin โ u faqat debug uchun foydali:
Symbollar har doim noyob. Bir xil tavsifli ikkita symbol yaratsak ham, ular teng bo'lmaydi:
console.log(id) ba'zi muhitlarda xato beradi. Satr kerak bo'lsa, aniq id.toString() yoki id.description ishlating.Yashirin ("maxfiy") xossalar
Symbollar yordamida obyektga "yashirin" xossalar qo'shish mumkin. Boshqa kod (hatto o'sha obyektni to'g'ridan-to'g'ri qamrab olgan kutubxona ham) bu xossaga tasodifan kira olmaydi yoki uni qayta yoza olmaydi:
Buning afzalligi: agar boshqa kutubxona ham user'ga "id" nomli satr xossa qo'shsa, ular to'qnashmaydi โ chunki symbol kaliti mutlaqo noyob.
let user = { [id]: 123 };Oddiy
id: 123 yozsak, kalit satr "id" bo'lib qoladi.Symbollar sikllardan yashiringan
Symbol kalitli xossalar for..in siklida va Object.keys()'da ko'rinmaydi โ ular "o'tkazib yuboriladi":
Aksincha, Object.assign() symbol xossalarni ham nusxalaydi โ bu ataylik shunday qilingan, chunki obyektni klonlaganda uning barcha xossalari (symbollar bilan birga) ko'chirilishi kerak.
Global reestr: Symbol.for
Ba'zan bir xil nomli symbolning butun dastur bo'ylab bir xil nusxasi kerak bo'ladi. Buning uchun global symbol reestri mavjud. Symbol.for(kalit) reestrda symbolni qidiradi, topmasa yaratadi:
Teskari amal โ Symbol.keyFor(sym) โ global symbol bo'yicha uning nomini qaytaradi:
Symbol("id") va Symbol.for("id") farqini eslang: birinchisi har doim yangi noyob symbol yaratadi; ikkinchisi global reestrdan bir xilini qaytaradi.Tizimli (well-known) simvollar
JavaScript'ning ichida oldindan belgilangan bir qator tizimli simvollar mavjud. Ular tilning ichki xatti-harakatini sozlashga imkon beradi. Ularga Symbol.* orqali murojaat qilinadi:
Symbol.iteratorโ obyektni iteratsiya qilinuvchi qilish uchun;Symbol.toPrimitiveโ obyektni primitivga o'girish qoidasini belgilash;Symbol.toStringTagโ obyekt turining maxsus nomi;Symbol.hasInstance,Symbol.asyncIteratorva boshqalar.
Masalan, Symbol.iterator yordamida oddiy obyektni for..of bilan aylanuvchi qilib bo'ladi (bu ilg'or mavzu, keyingi boblarda ko'ramiz). Keyingi darsda esa Symbol.toPrimitive bilan ishlaymiz.
Xulosa
Symbolโ noyob identifikatorlar uchun primitiv tur;Symbol(tavsif)bilan yaratiladi;- Har bir
Symbol()chaqiruvi โ yangi, boshqa hech kimga teng bo'lmagan qiymat; - Symbol kalitlar obyektga "yashirin" xossalar qo'shadi va
for..in,Object.keys'da ko'rinmaydi; Symbol.for(kalit)/Symbol.keyFor(sym)โ global reestr orqali umumiy symbollar;Symbol.iterator,Symbol.toPrimitivekabi tizimli simvollar til xatti-harakatini sozlaydi.