Obyektlar: asoslar

Obyektni primitivga o'girish

Obyektlar arifmetik yoki satr operatsiyalarida ishtirok etganda avtomatik ravishda primitivga o'giriladi. Bu darsda o'girish qanday sodir bo'lishini va uni qanday boshqarishni o'rganamiz.

Nima uchun kerak?

obj1 + obj2 yoki obj1 - obj2 qilsak nima bo'ladi? Bunday holda JavaScript obyektlarni avtomatik primitivga o'giradi, so'ng operatsiyani bajaradi. Natijada har doim primitiv qiymat (satr yoki son) chiqadi.

Muhim: obyektni primitivga o'girishda hech qachon boshqa obyekt hosil bo'lmaydi. Natija har doim primitiv (odatda satr yoki son) bo'ladi.

Hint ("ishora") tushunchasi

O'girish qanday amalga oshishi hint โ€” ya'ni kutilayotgan qiymat turiga bog'liq. Uch xil hint bor:

Ikkilik + operatori "default" hintni ishlatadi, chunki u ham sonlarni qo'shishi, ham satrlarni birlashtirishi mumkin. Deyarli barcha o'rnatilgan obyektlar (Datedan tashqari) "default"'ni "number" kabi qabul qiladi.

O'girish algoritmi

O'girishni bajarish uchun JavaScript quyidagi uchta metodni shu tartibda qidiradi va topilganini chaqiradi:

  1. obj[Symbol.toPrimitive](hint) โ€” agar bunday metod mavjud bo'lsa;
  2. Aks holda, hint "string" bo'lsa โ€” obj.toString(), keyin obj.valueOf();
  3. Aks holda (hint "number" yoki "default") โ€” obj.valueOf(), keyin obj.toString().

Bu metodlar primitiv qaytarishi kerak. Agar obyekt qaytarsa โ€” natija e'tiborsiz qoldiriladi (go'yo metod umuman yo'q edi).

Symbol.toPrimitive

Eng zamonaviy va to'liq usul โ€” obyektda Symbol.toPrimitive nomli tizimli metodni belgilash. U barcha o'girish holatlarini yagona joyda boshqaradi va hint'ni argument sifatida oladi:

toprimitive.js
// natija shu yerda chiqadi

Ko'ryapmizki, bitta metod hintga qarab turli natija qaytardi: String(user) satr oldi, +user son oldi, user + 500 esa default hint bilan sonni tanladi.

toString va valueOf

Symbol.toPrimitive bo'lmasa, JavaScript eskiroq โ€” toString va valueOf metodlariga murojaat qiladi. Ular hint olmaydi, lekin turli holatlarda chaqiriladi:

tostring-valueof.js
// natija shu yerda chiqadi

Amaliyotda ko'pincha faqat bitta toString() metodini yozish yetarli โ€” u "hammabop" bo'lib, barcha o'girishlarni satr ko'rinishida boshqaradi (agar valueOf bo'lmasa, u ham chaqiriladi):

faqat-tostring.js
// natija shu yerda chiqadi
Sukut bo'yicha oddiy obyektning toString() metodi "[object Object]" qaytaradi, valueOf() esa obyektning o'zini qaytaradi (ya'ni primitiv emas, shuning uchun e'tiborsiz).

Operatorlarda o'girish

Endi turli operatorlar qaysi hintni chaqirishini ko'raylik:

operatorlar.js
// natija shu yerda chiqadi

E'tibor bering: obj + "x"'da + avval obyektni default hint bilan primitiv (2) qildi, so'ng 2 + "x" satr birlashtiruvi "2x"'ga aylandi. Ya'ni o'girish natijasi primitiv bo'lgach, operatorning oddiy qoidalari amal qiladi.

Metod istalgan turdagi primitiv qaytarishi mumkin โ€” "string" hint majburan satr qaytishini talab qilmaydi, "number" ham majburan son emas. Faqat bitta qat'iy qoida: metodlar obyekt emas, primitiv qaytarishi shart.

Xulosa