Obyektlar: asoslar

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:

yaratish.js
// natija shu yerda chiqadi

Symbollar har doim noyob. Bir xil tavsifli ikkita symbol yaratsak ham, ular teng bo'lmaydi:

noyob.js
// natija shu yerda chiqadi
Symbollar avtomatik satrga o'girilmaydi. 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:

yashirin.js
// natija shu yerda chiqadi

Buning afzalligi: agar boshqa kutubxona ham user'ga "id" nomli satr xossa qo'shsa, ular to'qnashmaydi โ€” chunki symbol kaliti mutlaqo noyob.

Obyekt literalida symbol kalitini ishlatish uchun kvadrat qavs kerak:
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":

sikl.js
// natija shu yerda chiqadi

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:

for.js
// natija shu yerda chiqadi

Teskari amal โ€” Symbol.keyFor(sym) โ€” global symbol bo'yicha uning nomini qaytaradi:

keyfor.js
// natija shu yerda chiqadi
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:

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