Ob'ektdan primitivga konvertatsiya
JavaScript ob'ektlarga operatorlar bilan ishlashni sozlash imkoniyatini bermaydi. Masalan, Ruby yoki C++ kabi boshqa dasturlash tillarida maxsus ob'ekt metodlarini qo'shishimiz mumkin, lekin JavaScriptda bunday imkoniyat mavjud emas.
Agar biz ob'ektlarni qo'shsak, ayrsak yoki alert(obj) orqali chop etsak, ob'ektlar avtomatik ravishda primitiv qiymatlarga aylantiriladi, va keyin operatsiya ushbu primitiv qiymatlar ustida amalga oshiriladi.
Bu juda muhim cheklov: obj1 + obj2
(yoki boshqa matematik operatsiyalar) natija sifatida ob'ektni qaytara olmaydi!
Masalan, biz vektorlar yoki matritsalarni ifodalovchi ob'ektlarni qo'shib, "qo'shilgan" ob'ektni olishimiz mumkin emas. Bunday arxitektura imkoniyatlari avtomatik ravishda "taxtadan chiqariladi".
Shuning uchun, amalda ob'ektlar bilan matematik operatsiyalar mavjud emas. Bunday holatlar juda kam uchraydi va odatda kod xatoliklaridan kelib chiqadi.
Bu bo'limda ob'ekt qanday qilib primitivga aylantirilishini va bu konvertatsiyani qanday sozlash mumkinligini ko'rib chiqamiz.
Konvertatsiya qoidalari
Avvalroq "Turlarni konvertatsiya qilish" bo'limida primitivlarning sonli, string va boolean konvertatsiya qoidalarini ko'rib chiqdik. Endi ob'ektlar uchun bu qoidalarni to'ldiramiz.
- Boolean konvertatsiya mavjud emas. Barcha ob'ektlar boolean kontekstida
true
bo'ladi. Shunchaki, faqat sonli va string konvertatsiyalar mavjud. - Sonli konvertatsiya ob'ektlarni ayirish yoki matematik funksiyalarni qo'llashda amalga oshiriladi. Masalan,
Date
ob'ektlari (keyingi bo'limda ko'rib chiqamiz) ayirilishi mumkin vadate1 - date2
natijasi ikki sana orasidagi vaqt farqini beradi. - String konvertatsiya odatda ob'ektni
alert(obj)
orqali chiqarishda yoki shunga o'xshash kontekstlarda amalga oshiriladi.
Konvertatsiya uchun qoidalar
JavaScript qanday konvertatsiya qo'llashni qanday aniqlaydi?
Boshqa dasturlash tillarida qo'llaniladigan uchta variant mavjud. Ular "hints" deb ataladi va spetsifikatsiyada quyidagicha tasvirlangan:
-
"string": ob'ektdan string konvertatsiya qilish uchun, masalan,
alert
kabi operatsiyalarda: -
"number": ob'ektdan sonli konvertatsiya qilish uchun, masalan, matematik amallarda:
Ko'pgina o'rnatilgan matematik funksiyalar ham bunday konvertatsiyani o'z ichiga oladi.
-
"default": juda kam holatlarda operator "qanday turga umid qilmasligini" aniqlamaganida qo'llaniladi.
Misol uchun, ikkilamchi qo'shish
+
ham stringlarni birlashtiradi, ham sonlarni qo'shadi. Agar ikkilamchi qo'shish ob'ektdan argument sifatida olinsa, u "default" hintini qo'llaydi va konvertatsiyani amalga oshiradi.Shuningdek, agar ob'ekt
==
orqali string, son yoki symbol bilan solishtirilsa, qaysi konvertatsiya amalga oshirilishi aniq bo'lmaydi, shuning uchun "default" hinti ishlatiladi.
Symbol.toPrimitive
JavaScript quyidagi uchta ob'ekt metodlarini chaqiradi:
obj[Symbol.toPrimitive](hint)
- agar bunday metod mavjud bo'lsa,Symbol.toPrimitive
yordamida chaqiriladi.- Agar hint
"string"
bo'lsa:obj.toString()
yokiobj.valueOf()
chaqiriladi, qaysi biri mavjud bo'lsa.
- Agar hint
"number"
yoki"default"
bo'lsa:obj.valueOf()
yokiobj.toString()
chaqiriladi, qaysi biri mavjud bo'lsa.
Symbol.toPrimitive - o'zgarish metodini belgilash uchun o'rnatilgan symbol:
Agar Symbol.toPrimitive
metodi mavjud bo'lsa, u barcha hintlar uchun ishlatiladi va boshqa metodlar kerak bo'lmaydi.
Masalan, user
ob'ekti quyidagicha amalga oshiriladi:
Bu kodda user
ob'ekti string
yoki number
konvertatsiyasi uchun qanday ishlashini ko'rsating. Yagona metod user[Symbol.toPrimitive]
barcha konvertatsiya holatlarini boshqaradi.
toString/valueOf
Agar Symbol.toPrimitive
mavjud bo'lmasa, JavaScript toString
va valueOf
metodlarini izlaydi:
- "string" hint uchun:
toString
metodi chaqiriladi, agar mavjud bo'lmasa yoki primitiv qiymat qaytarmasa,valueOf
chaqiriladi (shuning uchuntoString
string konvertatsiyalar uchun ustunlikka ega). - Boshqa hintlar uchun:
valueOf
chaqiriladi, agar mavjud bo'lmasa yoki primitiv qiymat qaytarmasa,toString
chaqiriladi (shuning uchunvalueOf
matematik konvertatsiyalar uchun ustunlikka ega).
Bu metodlar primitiv qiymat qaytarishi kerak. Agar toString
yoki valueOf
ob'ekt qaytarsa, u e'tiborga olinmaydi.
Misol:
Agar ob'ektni string sifatida ishlatsak, masalan, alert
yoki shunga o'xshash, biz defaultda [object Object]
ko'rishimiz mumkin.
Agar toString
mavjud bo'lsa, konvertatsiya qilish uchun, valueOf
metodini amalga oshirib, avvalgi kodni qayta ishlash mumkin.
Qo'shimcha konvertatsiyalar
Ko'pgina operatorlar va funksiyalar turlarni konvertatsiya qiladi, masalan, ko'paytirish *
operandlarni sonlarga aylantiradi.
Agar ob'ekt argument sifatida o'tkazilsa, ikki bosqichli hisob-kitoblar mavjud:
- Ob'ekt primitivga aylantiriladi (yuqoridagi qoidalar bo'yicha).
- Agar zarur bo'lsa, natijaviy primitiv ham konvertatsiya qilinadi.
Misol:
Agar ob'ekt *
bilan ko'paytirilsa, avval ob'ekt primitivga (string "2") aylantiriladi. Keyin "2" * 2
2 * 2 ga o'zgaradi (string songa kon
vertatsiya qilinadi).
Ikki marta qo'shish, stringlarni birlashtiradi:
Xulosa
Ob'ektdan primitivga konvertatsiya ko'plab o'rnatilgan funksiyalar va operatorlar tomonidan avtomatik ravishda amalga oshiriladi.
Uchta turdagi konvertatsiya mavjud:
"string"
(string kerak bo'lgan operatsiyalar uchun)"number"
(matematik operatsiyalar uchun)"default"
(ba'zi operatorlar, odatda ob'ektlar "number" kabi ishlaydi)
Konvertatsiya algoritmi:
- Agar mavjud bo'lsa,
obj[Symbol.toPrimitive](hint)
chaqiriladi. - Agar hint
"string"
bo'lsa:obj.toString()
yokiobj.valueOf()
chaqiriladi, qaysi biri mavjud bo'lsa.
- Agar hint
"number"
yoki"default"
bo'lsa:obj.valueOf()
yokiobj.toString()
chaqiriladi, qaysi biri mavjud bo'lsa.
Barcha metodlar primitiv qiymat qaytarishi kerak (agar mavjud bo'lsa).
Amalda, ko'pincha obj.toString()
faqat string konvertatsiyalar uchun “catch-all” metod sifatida ishlatiladi va ob'ektning “insonga o'xshash” ko'rinishini qaytaradi, loglash yoki debugging maqsadlari uchun.