Obyektlar: asoslar

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:

nuqta.js
// natija shu yerda chiqadi

Xossaning qiymatini o'zgartirish yoki yangi xossa qo'shish uchun ham nuqtadan foydalanamiz:

qoshish.js
// natija shu yerda chiqadi
Qiymat sifatida istalgan tur bo'lishi mumkin. Masalan, boolean (true/false), son, satr yoki boshqa obyekt.

Xossani o'chirish: delete

Xossani obyektdan butunlay olib tashlash uchun delete operatoridan foydalanamiz:

delete.js
// natija shu yerda chiqadi

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:

qavslar.js
// natija shu yerda chiqadi

Kvadrat qavslarning eng kuchli jihati โ€” ular ichiga o'zgaruvchi qo'yish mumkin. Bu nuqta bilan iloji yo'q:

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

hisoblangan.js
// natija shu yerda chiqadi

Bu yerda [fruit] "xossa nomini fruit o'zgaruvchisidan ol" degan ma'noni bildiradi. Qavslar ichida murakkabroq ifoda ham bo'lishi mumkin:

hisoblangan2.js
// natija shu yerda chiqadi

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:

qisqartma.js
// natija shu yerda chiqadi
Qisqartma va odatiy yozuvni aralashtirish 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:

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

in-undefined.js
// natija shu yerda chiqadi

for..in sikli

Obyektning barcha xossalari ustidan aylanish uchun maxsus for..in sikli bor. Bu โ€” biz bilgan for(;;) siklidan tamoman farq qiladi:

forin.js
// natija shu yerda chiqadi

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.

tartib.js
// natija shu yerda 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