Obyektlar
JavaScript'da sakkizta ma'lumot turi bor. Ulardan yettitasi "primitiv" (son, satr, boolean va h.k.) deb ataladi, chunki ular bitta qiymatni saqlaydi. Obyekt esa turli xil ma'lumotlar to'plamini va murakkabroq mavjudotlarni saqlash uchun ishlatiladi. Ushbu darsda obyektlar bilan chuqur tanishamiz.
Obyekt nima?
Obyekt โ bu "kalit: qiymat" ko'rinishidagi juftliklardan tashkil topgan to'plam. Bu yerda kalit โ satr (uni xossa nomi yoki property name deb ataymiz), qiymat esa istalgan tur bo'lishi mumkin: son, satr, boolean, hatto boshqa obyekt yoki funksiya.
Primitiv turlarni bitta qutiga o'xshatsak, obyektni bir nechta bo'lmali javon deb tasavvur qiling: har bir bo'lmaning yorlig'i (kalit) bor, va har bir bo'lmada biror narsa (qiymat) yotadi.
Bo'sh obyektni ikki xil usulda yaratish mumkin:
let user = new Object(); // "obyekt konstruktori" sintaksisi
let user = {}; // "obyekt literali" sintaksisi
Ikkinchi usul โ jingalak qavslar {} โ ancha keng qo'llaniladi va "obyekt literali" deb ataladi. Odatda aynan shuni ishlatamiz.
Xossalar (literal va qiymatlar)
Obyektni yaratishda uning ichiga darhol xossalarni joylashtirishimiz mumkin. Har bir xossa kalit: qiymat ko'rinishida, juftliklar esa vergul bilan ajratiladi:
let user = { // obyekt
name: "Jaloliddin", // "name" kaliti "Jaloliddin" qiymatini saqlaydi
age: 30 // "age" kaliti 30 qiymatini saqlaydi
};
Bu yerda user obyektida ikkita xossa bor. Chapda โ kalit (nom), o'ngda โ qiymat. Buni quyidagicha tasavvur qiling: name yorlig'i ostida "Jaloliddin" saqlanadi, age yorlig'i ostida esa 30.
Nuqta orqali xossalarga murojaat
Xossa qiymatini o'qish uchun nuqta (dot notation) belgisidan foydalanamiz:
Xossaning qiymatini o'zgartirish yoki yangi xossa qo'shish uchun ham nuqtadan foydalanamiz:
true/false), son, satr yoki boshqa obyekt.Xossani o'chirish: delete
Xossani obyektdan butunlay olib tashlash uchun delete operatoridan foydalanamiz:
Mavjud bo'lmagan xossaga murojaat qilinsa, xato bermaydi โ shunchaki undefined qaytadi. Bu obyektning muhim xususiyati: yo'q xossa qiymati har doim undefined.
Ko'p so'zli xossa nomlari
Xossa nomi bir necha so'zdan iborat bo'lishi mumkin, ammo bunda uni tirnoq ichiga olish shart:
let user = {
name: "Jaloliddin",
age: 30,
'likes birds': true // ko'p so'zli nom tirnoq ichida bo'lishi shart
};
let, for, return kabi til kalit so'zlari xossa nomlari bo'la oladi โ obyekt xossalarida hech qanday cheklov yo'q. Ammo ko'p so'zli yoki maxsus belgili nomlar tirnoqni talab qiladi.Kvadrat qavslar (bracket notation)
Ko'p so'zli xossalarda nuqta ishlamaydi, chunki JavaScript nuqtadan keyin to'g'ri identifikatorni kutadi:
// Bu XATO beradi:
// user.likes birds = true;
Yechim โ kvadrat qavslar. Ular istalgan satr bilan ishlaydi:
Kvadrat qavslarning eng kuchli jihati โ ular ichiga o'zgaruvchi qo'yish mumkin. Bu nuqta bilan iloji yo'q:
user[key] va user.key โ bir xil emas! user.key aynan "key" nomli xossani qidiradi, user[key] esa key o'zgaruvchining qiymatidagi nomli xossani qidiradi.Hisoblangan xossalar (computed properties)
Obyekt literalida kvadrat qavslardan foydalansak, xossa nomini ifoda orqali hisoblab qo'yishimiz mumkin. Bunday xossa hisoblangan xossa (computed property) deb ataladi:
Bu yerda [fruit] "xossa nomini fruit o'zgaruvchisidan ol" degan ma'noni bildiradi. Qavslar ichida murakkabroq ifoda ham bo'lishi mumkin:
Xossa qisqartmasi (property shorthand)
Amaliyotda ko'pincha xossa qiymatini bir xil nomli o'zgaruvchidan olamiz. Buning uchun maxsus qisqartma bor:
function makeUser(name, age) {
return {
name: name, // odatiy yozuv
age: age
};
}
name: name o'rniga shunchaki name deb yozish mumkin:
{ name, age: 30 } โ mutlaqo to'g'ri."in" operatori
Ko'rdikki, yo'q xossaga murojaat undefined qaytaradi. Bu bilan xossa borligini tekshirsak bo'ladi:
let user = { name: "Jaloliddin", age: 30 };
console.log(user.noSuchProperty === undefined); // true โ xossa yo'q
Ammo aniqroq usul bor โ in operatori. Sintaksis: "kalit" in obyekt:
inning chap tomonida xossa nomi satr bo'lishi kerak. Agar tirnoqsiz yozsak, u o'zgaruvchi deb qabul qilinadi: let key = 'age'; console.log(key in user);.Nima uchun aynan in kerak, agar undefined bilan tekshirish mumkin bo'lsa? Chunki ba'zan xossa mavjud, lekin uning qiymati aynan undefined bo'ladi. Bunday holatda === undefined aldaydi, in esa haqiqatni ko'rsatadi:
for..in sikli
Obyektning barcha xossalari ustidan aylanish uchun maxsus for..in sikli bor. Bu โ biz bilgan for(;;) siklidan tamoman farq qiladi:
Bu yerda key โ har aylanishda xossa nomini oladi. Xossa nomini istalgan boshqacha atash mumkin (let prop in user), key โ shunchaki keng tarqalgan tanlov.
Butun sonli kalitlar tartibi
Xossalar qanday tartibda joylashadi? for..inda ular maxsus tartiblangan: butun son ko'rinishidagi kalitlar o'sish tartibida, qolganlari esa yaratilish tartibida chiqadi.
Agar kalitlar butun son bo'lmasa (masalan, oldiga + qo'shsak yoki harf aralashtirilsa), tartib yaratilish ketma-ketligiga qaytadi. Bu "butun son xossa" (integer property) qoidasi deb ataladi.
Xulosa
- Obyekt โ
{}ichidakalit: qiymatjuftliklari to'plami; - Xossalarga nuqta (
obj.prop) yoki kvadrat qavslar (obj["prop"]) orqali murojaat qilinadi; - Kvadrat qavslar o'zgaruvchi va ifodalar bilan ishlaydi, nuqta esa faqat qat'iy nom bilan;
deleteโ xossani o'chiradi, yo'q xossaundefinedqaytaradi;[ifoda]: qiymatโ hisoblangan xossa;{ name }โ xossa qisqartmasi;"kalit" in objโ xossa borligini aniq tekshiradi;for..inโ barcha xossalar ustidan aylanadi.