O‘zgarmas primitiv qiymatlar va o‘zgaruvchan obyekt havolalari

JavaScript'da primitiv qiymatlar (undefined, null, mantiqiy qiymatlar, sonlar va satrlar) va obyektlar (jumladan, massivlar va funksiyalar) o‘rtasida fundamental farq mavjud.

Primitivlar o‘zgarmasdir (immutable): primitiv qiymatni o‘zgartirishning ("mutatsiya" qilishning) iloji yo‘q. Bu sonlar va mantiqiy qiymatlar uchun yaqqol ko‘rinib turibdi — biror sonning qiymatini o‘zgartirish haqida gapirishning o‘zi mantiqsiz. Biroq bu holat satrlar uchun unchalik aniq emas. Satrlar belgilar massiviga o‘xshagani uchun, siz istalgan indeksdagi belgini o‘zgartirish mumkin deb kutishingiz mumkin. Aslida esa, JavaScript bunga yo‘l qo‘ymaydi va satrni o‘zgartirgandek tuyuladigan barcha satr metodlari aslida yangi satr qiymatini qaytaradi. Masalan:

Primitivlar, shuningdek, qiymati bo‘yicha taqqoslanadi: ikki qiymat faqatgina ularning qiymatlari bir xil bo‘lgandagina teng hisoblanadi. Bu sonlar, mantiqiy qiymatlar, null va undefined uchun o‘z-o‘zidan tushunarlidek tuyuladi: ularni boshqacha taqqoslashning ilojisi ham yo‘q. Lekin bu holat yana satrlar uchun juda unchalik aniq emas. Agar ikkita alohida satr qiymati taqqoslansa, JavaScript ularni faqat va faqat uzunliklari bir xil bo‘lsa va har bir indeksdagi belgisi mos kelsagina teng deb hisoblaydi.

Obyektlarning o‘ziga xosligi

Obyektlar primitivlardan farq qiladi. Birinchidan, ular o‘zgaruvchandir (mutable) — ularning qiymatlarini o‘zgartirish mumkin:

Obyektlar qiymati bo‘yicha taqqoslanmaydi: ikkita alohida obyekt, hatto ularning xossalari va qiymatlari bir xil bo‘lsa ham, teng emas. Va ikkita alohida massiv, hatto ularning elementlari bir xil tartibda bo‘lsa ham, teng emas:

Obyektlarni JavaScript'ning primitiv tiplaridan farqlash uchun ularni ba’zan havola tiplari (reference types) deb atashadi. Bu terminologiyadan foydalansak, obyekt qiymatlari — bu havolalardir (references), va biz obyektlar havolasi bo‘yicha taqqoslanadi deymiz: ikki obyekt qiymati faqat va faqat ular bitta asosiy obyektga ishora qilsagina teng bo‘ladi.

Ushbu koddan ko‘rinib turibdiki, obyektni (yoki massivni) o‘zgaruvchiga tayinlash shunchaki havolani tayinlaydi: u obyektning yangi nusxasini yaratmaydi. Agar siz obyekt yoki massivning yangi nusxasini yaratmoqchi bo‘lsangiz, obyektning xossalarini yoki massivning elementlarini birma-bir ko‘chirib chiqishingiz kerak. Bu misol for siklidan (§5.4.3) foydalanishni ko‘rsatadi:

Xuddi shunday, agar biz ikkita alohida obyekt yoki massivni taqqoslamoqchi bo‘lsak, ularning xossalarini yoki elementlarini birma-bir taqqoslashimiz kerak. Bu kod ikkita massivni taqqoslaydigan funksiyani aniqlaydi: