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.
Boshqa tiplar avtomatik ravishda satrlarga aylantiriladi.
Masalan, 0 raqami xossa kaliti sifatida ishlatilganda "0" satriga aylanadi:
let obj = {
0: "test", // "0": "test" bilan bir xil
};
// ikkala alert ham bir xil xossaga kiradi (0 raqami "0" satriga aylantiriladi)
alert(obj["0"]); // test
alert(obj[0]); // test (bir xil xossa)
__proto__ nomli maxsus xossa bilan kichik muammo bor. Biz uni obyekt boâlmagan qiymatga oârnatib boâlmaydi:
let obj = {};
obj.__proto__ = 5; // raqam tayinlash
alert(obj.__proto__); // [object Object] - qiymat obyekt, mo'ljallangan tarzda ishlamadi
Koddan koârib turganimizdek, 5 primitiviga tayinlash eâtiborga olinmaydi.
Biz __proto__ ning maxsus tabiatini keyingi boblarda koârib chiqamiz va bunday xatti-harakatni tuzatish usullarini taklif qilamiz.
Xossa mavjudligi testi, âinâ operatori
JavaScript-dagi obyektlarning koâplab boshqa tillar bilan solishtirganda diqqatga sazovor xususiyati shundaki, har qanday xossaga kirish mumkin. Agar xossa mavjud boâlmasa, xato boâlmaydi!
Mavjud boâlmagan xossani oâqish shunchaki undefined qaytaradi. Shunday qilib, xossa mavjudligini osongina tekshirishimiz mumkin:
let user = {};
alert(user.noSuchProperty === undefined); // true "bunday xossa yo'q" degan ma'noni bildiradi
Buning uchun maxsus "in" operatori ham mavjud.
Sintaksis:
"key" in object;
Masalan:
let user = { name: "John", age: 30 };
alert("age" in user); // true, user.age mavjud
alert("blabla" in user); // false, user.blabla mavjud emas
Eâtibor bering, in ning chap tomonida xossa nomi boâlishi kerak. Bu odatda qoâshtirnoqli satr.
Agar qoâshtirnoqlarni tashlab qoâysak, bu oâzgaruvchi tekshirilishi kerak boâlgan haqiqiy nomni oâz ichiga olishi kerakligini anglatadi. Masalan:
let user = { age: 30 };
let key = "age";
alert( key in user ); // true, "age" xossasi mavjud
Nima uchun in operatori mavjud? undefined bilan solishtirish yetarli emasmi?
Koâpchilik hollarda undefined bilan solishtirish yaxshi ishlaydi. Lekin u muvaffaqiyatsiz boâlgan, lekin "in" toâgâri ishlaydigan maxsus holat bor.
Bu obyekt xossasi mavjud, lekin undefined ni saqlagan payt:
let obj = {
test: undefined,
};
alert(obj.test); // bu undefined, demak - bunday xossa yo'qmi?
alert("test" in obj); // true, xossa mavjud!
Yuqoridagi kodda obj.test xossasi texnik jihatdan mavjud. Shuning uchun in operatori toâgâri ishlaydi.
Bunday vaziyatlar juda kam uchraydi, chunki undefined aniq tayinlanmasligi kerak. Biz asosan ânomaâlumâ yoki âboâshâ qiymatlar uchun null dan foydalanamiz. Shuning uchun in operatori koddagi ekzotik mehmon hisoblanadi.
"for..in" tsikli
Obyektning barcha kalitlari boâylab yurish uchun tsiklning maxsus shakli mavjud: for..in. Bu biz ilgari oârgangan for(;;) konstruksiyasidan butunlay boshqa narsa.
Sintaksis:
for (key in object) {
// obyekt xossalari orasidagi har bir kalit uchun tanani bajaradi
}
Masalan, user ning barcha xossalarini chiqaramiz:
let user = {
name: "John",
age: 30,
isAdmin: true,
};
for (let key in user) {
// kalitlar
alert(key); // name, age, isAdmin
// kalitlar uchun qiymatlar
alert(user[key]); // John, 30, true
}
Eâtibor bering, barcha âforâ konstruksiyalari bizga tsikl ichida tsikl oâzgaruvchisini eâlon qilishga imkon beradi, bu yerda let key kabi.
Shuningdek, biz bu yerda key oârniga boshqa oâzgaruvchi nomidan foydalanishimiz mumkin. Masalan, "for (let prop in obj)" ham keng ishlatiladi.
Obyekt kabi tartiblangan
Obyektlar tartiblanganmi? Boshqacha qilib aytganda, agar biz obyekt boâylab tsikl qilsak, barcha xossalarni ular qoâshilgan tartibda olamizmi? Bunga ishonishimiz mumkinmi?
Qisqa javob: âmaxsus tarzda tartiblanganâ: butun son xossalari saralanadi, boshqalar yaratilish tartibida paydo boâladi. Tafsilotlar quyida.
Misol sifatida, telefon kodlari bilan obyektni koârib chiqaylik:
let codes = {
"49": "Germaniya",
"41": "Shveytsariya",
"44": "Buyuk Britaniya",
// ..,
"1": "AQSH"
};
for (let code in codes) {
alert(code); // 1, 41, 44, 49
}
Obyekt foydalanuvchiga variantlar roâyxatini taklif qilish uchun ishlatilishi mumkin. Agar biz asosan nemis auditoriyasi uchun sayt yaratayotgan boâlsak, ehtimol 49 birinchi boâlishini xohlaymiz.
Lekin kodni ishga tushirsak, butunlay boshqa rasmni koâramiz:
- AQSH (1) birinchi oârinda
- keyin Shveytsariya (41) va hokazo.
Telefon kodlari oâsish tartibida saralanadi, chunki ular butun sonlar. Shuning uchun biz 1, 41, 44, 49 ni koâramiz.
Bu yerdagi âbutun son xossasiâ atamasi oâzgarishsiz butun songa aylantirilishi va undan qaytarilishi mumkin boâlgan satrni anglatadi.
Shunday qilib, "49" butun son xossa nomi, chunki u butun son raqamiga aylantirilganda va orqaga qaytarilganda, u bir xil boâlib qoladi. Lekin "+49" va "1.2" emas:
// Number(...) aniq ravishda raqamga aylantiradi
// Math.trunc kasr qismini olib tashlaydigan o'rnatilgan funksiya
alert( String(Math.trunc(Number("49"))) ); // "49", bir xil, butun son xossasi
alert( String(Math.trunc(Number("+49"))) ); // "49", bir xil emas "+49" â butun son xossasi emas
alert( String(Math.trunc(Number("1.2"))) ); // "1", bir xil emas "1.2" â butun son xossasi emas
â¦Boshqa tomondan, agar kalitlar butun son boâlmasa, ular yaratilish tartibida roâyxatlanadi:
let user = {
name: "John",
surname: "Smith"
};
user.age = 25; // yana birini qo'shish
// butun son bo'lmagan xossalar yaratilish tartibida ro'yxatlanadi
for (let prop in user) {
alert( prop ); // name, surname, age
}
Shunday qilib, telefon kodlari bilan muammoni hal qilish uchun biz kodlarni butun son boâlmagan qilib âaldashimizâ mumkin. Har bir kod oldiga plus "+" belgisini qoâshish kifoya.
Quyidagicha:
let codes = {
"+49": "Germaniya",
"+41": "Shveytsariya",
"+44": "Buyuk Britaniya",
// ..,
"+1": "AQSH",
};
for (let code in codes) {
alert(+code); // 49, 41, 44, 1
}
Endi u moâljallangan tarzda ishlaydi.
Xulosa
Obyektlar bir nechta maxsus xususiyatlarga ega assotsiativ massivlardir.
Ular xossalarni (kalit-qiymat juftliklarini) saqlaydi, bu yerda:
- Xossa kalitlari satrlar yoki symbollar boâlishi kerak (odatda satrlar).
- Qiymatlar har qanday tipda boâlishi mumkin.
Xossaga kirish uchun biz quyidagilardan foydalanishimiz mumkin:
- Nuqta notation:
obj.property. - Kvadrat qavslar notation
obj["property"]. Kvadrat qavslar kalitni oâzgaruvchidan olishga imkon beradi, masalanobj[varWithKey].
Qoâshimcha operatorlar:
- Xossani oâchirish uchun:
delete obj.prop. - Berilgan kalit bilan xossa mavjudligini tekshirish uchun:
"key" in obj. - Obyekt boâylab iteratsiya qilish uchun:
for (let key in obj)tsikli.
Ushbu bobda oârgangan narsa âoddiy obyektâ yoki shunchaki Object deb ataladi.
JavaScript-da koâplab boshqa obyekt turlari mavjud:
Arraytartiblangan maâlumotlar toâplamini saqlash uchun,Datesana va vaqt haqidagi maâlumotlarni saqlash uchun,Errorxato haqidagi maâlumotlarni saqlash uchun.- â¦Va hokazo.
Ularning oâzlarining maxsus xususiyatlari bor, biz ularni keyinroq oârganamiz. Baâzan odamlar âArray turiâ yoki âDate turiâ kabi narsalarni aytishadi, lekin rasman ular oâzlarining turlari emas, balki bitta âobyektâ maâlumot turiga tegishli. Va ular uni turli yoâllar bilan kengaytiradilar.
JavaScript-dagi obyektlar juda kuchli. Bu yerda biz haqiqatan ham katta mavzuning faqat yuzasini tirnagandik. Biz oâquv qoâllanmasining keyingi qismlarida obyektlar bilan yaqindan ishlaymiz va ular haqida koâproq bilib olamiz.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)