Ma'lumotlar turlari bobidan ma’lum bo’lganidek, JavaScript-da sakkizta ma’lumot turi mavjud. Ulardan yettitasi “primitiv” deb ataladi, chunki ularning qiymatlari faqat bitta narsani o’z ichiga oladi (satr, raqam yoki boshqa narsa bo’lsin).
Aksincha, obyektlar turli ma’lumotlarning kalitli to’plamlarini va murakkabroq obyektlarni saqlash uchun ishlatiladi. JavaScript-da obyektlar tilning deyarli har bir jihatiga kiradi. Shuning uchun biz boshqa joylarga chuqur kirishdan oldin avval ularni tushunishimiz kerak.
Obyekt {…} jingalak qavslar bilan xossalar ning ixtiyoriy ro’yxati bilan yaratilishi mumkin. Xossa – bu “kalit: qiymat” juftligi, bu yerda kalit satr (“xossa nomi” deb ham ataladi), qiymat esa har qanday narsa bo’lishi mumkin.
Biz obyektni imzolangan fayllari bo’lgan shkaf sifatida tasavvur qilishimiz mumkin. Har bir ma’lumot o’z faylida kalit orqali saqlanadi. Faylni nomi bilan topish yoki fayl qo’shish/olib tashlash oson.
Bo’sh obyekt (“bo’sh shkaf”) ikki sintaksisdan birini ishlatib yaratilishi mumkin:
let user = new Object(); // "obyekt konstruktor" sintaksisi
let user = {}; // "obyekt literal" sintaksisi
Odatda jingalak qavslar {...} ishlatiladi. Bu e’lon obyekt literal deb ataladi.
Literallar va xossalar
Biz darhol {...} ichiga “kalit: qiymat” juftligi sifatida ba’zi xossalarni qo’yishimiz mumkin:
let user = {
// obyekt
name: "John", // "name" kaliti orqali "John" qiymatini saqlash
age: 30, // "age" kaliti orqali 30 qiymatini saqlash
};
Xossa ikki nuqta ":" dan oldin kalitga (shuningdek “nom” yoki “identifikator” deb ham tanilgan) va uning o’ng tomonida qiymatga ega.
user obyektida ikkita xossa mavjud:
- Birinchi xossaning nomi
"name"va qiymati"John". - Ikkinchisining nomi
"age"va qiymati30.
Natijada olingan user obyektini “name” va “age” yorliqlari bilan belgilangan ikkita imzolangan fayl bo’lgan shkaf sifatida tasavvur qilish mumkin.
Biz undan istalgan vaqtda fayllarni qo’shish, olib tashlash va o’qishimiz mumkin.
Xossa qiymatlari nuqta notation orqali kirish mumkin:
// obyektning xossa qiymatlarini olish:
alert(user.name); // John
alert(user.age); // 30
Qiymat har qanday tipda bo’lishi mumkin. Keling, boolean qo’shamiz:
user.isAdmin = true;
Xossani olib tashlash uchun delete operatoridan foydalanishimiz mumkin:
delete user.age;
Shuningdek, ko’p so’zli xossa nomlaridan foydalanishimiz mumkin, lekin ular qo’shtirnoq ichida bo’lishi kerak:
let user = {
name: "John",
age: 30,
"likes birds": true, // ko'p so'zli xossa nomi qo'shtirnoq ichida bo'lishi kerak
};
Ro’yxatdagi oxirgi xossa vergul bilan tugashi mumkin:
let user = {
name: "John",
age: 30,
}
Bu “ortiqcha” yoki “osilgan” vergul deb ataladi. Xossalarni qo’shish/olib tashlash/ko’chirish osonlashadi, chunki barcha qatorlar bir xil bo’ladi.
Kvadrat qavslar
Ko’p so’zli xossalar uchun nuqta kirish ishlamaydi:
// bu sintaksis xatosini beradi
user.likes birds = true
JavaScript buni tushunmaydi. U bizning user.likes ga murojaat qilayotganimizni o’ylaydi va kutilmagan birds ga duch kelganda sintaksis xatosini beradi.
Nuqta kalitning to’g’ri o’zgaruvchi identifikatori bo’lishini talab qiladi. Bu shuni anglatadi: bo’shliqlar yo’q, raqam bilan boshlanmaydi va maxsus belgilarni o’z ichiga olmaydi ($ va _ ruxsat etilgan).
Har qanday satr bilan ishlaydigan muqobil “kvadrat qavs notation” mavjud:
let user = {};
// o'rnatish
user["likes birds"] = true;
// olish
alert(user["likes birds"]); // true
// o'chirish
delete user["likes birds"];
Endi hammasi yaxshi. E’tibor bering, qavslar ichidagi satr to’g’ri qo’shtirnoq ichida (har qanday turdagi qo’shtirnoq mos keladi).
Kvadrat qavslar shuningdek xossa nomini har qanday ifoda natijasi sifatida olish usulini taqdim etadi – literal satrdan farqli o’laroq – masalan o’zgaruvchidan quyidagicha:
let key = "likes birds";
// user["likes birds"] = true; bilan bir xil;
user[key] = true;
Bu yerda key o’zgaruvchisi bajarilish vaqtida hisoblanishi yoki foydalanuvchi kirishiga bog’liq bo’lishi mumkin. Va keyin biz uni xossaga kirish uchun ishlatamiz. Bu bizga katta moslashuvchanlik beradi.
Masalan:
let user = {
name: "John",
age: 30,
};
let key = prompt("Foydalanuvchi haqida nimani bilmoqchisiz?", "name");
// o'zgaruvchi orqali kirish
alert(user[key]); // John (agar "name" kiritilsa)
Nuqta notation shunga o’xshash tarzda ishlatilishi mumkin emas:
let user = {
name: "John",
age: 30,
};
let key = "name";
alert(user.key); // undefined
Hisoblangan xossalar
Obyekt yaratishda obyekt literalida kvadrat qavslardan foydalanishimiz mumkin. Bu hisoblangan xossalar deb ataladi.
Masalan:
let fruit = prompt("Qaysi mevani sotib olish kerak?", "apple");
let bag = {
[fruit]: 5, // xossa nomi fruit o'zgaruvchisidan olinadi
};
alert( bag.apple ); // agar fruit="apple" bo'lsa 5
Hisoblangan xossa ma’nosi oddiy: [fruit] xossa nomini fruit dan olish kerakligini anglatadi.
Shunday qilib, agar tashrif buyuruvchi "apple" ni kiritsa, bag {apple: 5} ga aylanadi.
Asosan, bu quyidagi bilan bir xil ishlaydi:
let fruit = prompt("Qaysi mevani sotib olish kerak?", "apple");
let bag = {};
// xossa nomini fruit o'zgaruvchisidan olish
bag[fruit] = 5;
…Lekin chiroyliroq ko’rinadi.
Kvadrat qavslar ichida murakkabroq ifodalardan foydalanishimiz mumkin:
let fruit = "apple";
let bag = {
[fruit + "Computers"]: 5, // bag.appleComputers = 5
};
Kvadrat qavslar nuqta notationdan ancha kuchliroq. Ular har qanday xossa nomlari va o’zgaruvchilarga ruxsat beradi. Lekin ular yozish uchun ham noqulayroq.
Shuning uchun ko’p hollarda, xossa nomlari ma’lum va oddiy bo’lganda, nuqta ishlatiladi. Va agar bizga murakkabroq narsa kerak bo’lsa, kvadrat qavslarga o’tamiz.
Xossa qiymati qisqartmasi
Haqiqiy kodda biz ko’pincha mavjud o’zgaruvchilarni xossa nomlari uchun qiymat sifatida ishlatamiz.
Masalan:
function makeUser(name, age) {
return {
name: name,
age: age,
// ...boshqa xossalar
};
}
let user = makeUser("John", 30);
alert(user.name); // John
Yuqoridagi misolda xossalar o’zgaruvchilar bilan bir xil nomlarga ega. O’zgaruvchidan xossa yaratish holati shunchalik keng tarqalganki, uni qisqaroq qilish uchun maxsus xossa qiymati qisqartmasi mavjud.
name:name o’rniga biz shunchaki name yozishimiz mumkin:
function makeUser(name, age) {
return {
name, // name: name bilan bir xil
age, // age: age bilan bir xil
// ...
};
}
Bir xil obyektda oddiy xossalar va qisqartmalardan foydalanishimiz mumkin:
let user = {
name, // name:name bilan bir xil
age: 30,
};
Xossa nomlari cheklovlari
Bizga ma’lumki, o’zgaruvchi “for”, “let”, “return” va hokazo kabi tilning zahiralangan so’zlariga teng nomga ega bo’la olmaydi.
Lekin obyekt xossasi uchun bunday cheklov yo’q:
// bu xossalar yaxshi
let obj = {
for: 1,
let: 2,
return: 3,
};
alert(obj.for + obj.let + obj.return); // 6
Qisqacha, xossa nomlarida hech qanday cheklov yo’q. Ular har qanday satrlar yoki symbollar (identifikatorlar uchun maxsus tip, keyinroq yoritiladi) bo’lishi mumkin.