Arrays
Obyektlar sizga kalitlangan qiymatlar to'plamini saqlash imkonini beradi. Bu yaxshi.
Ammo ko'pincha bizga tartiblangan to'plam kerak bo'ladi, ya'ni birinchi, ikkinchi, uchinchi elementlar va hokazo. Misol uchun, biz buni foydalanuvchilar, tovarlar, HTML elementlarining ro'yxatini saqlash uchun ishlatamiz.
Bu yerda obyektni ishlatish qulay emas, chunki u elementlarning tartibini boshqarish uchun metodlarni taqdim etmaydi. Biz yangi xususiyat qo'sha olmaymiz, mavjud xususiyatlar orasida bo'lishi mumkin. Obyektlar shunday ishlatilmagan.
Tartiblangan to'plamlarni saqlash uchun maxsus ma'lumotlar tuzilmasi mavjud - Array.
E'lon qilish
Bo'sh massiv yaratish uchun ikkita sintaksis mavjud:
Ko'pincha ikkinchi sintaksis ishlatiladi. Biz boshlang'ich elementlarni qavslar ichida ko'rsatishimiz mumkin:
Massiv elementlari raqamlangan, noldan boshlanadi.
Elementni uning raqamida olishimiz mumkin:
Elementni almashtirish mumkin:
Yangi element qo'shish mumkin:
Massivdagi elementlar soni uning uzunligini bildiradi:
Butun massivni ko'rsatish uchun alert
ishlatilishi mumkin:
Massiv har qanday turdagi elementlarni saqlashi mumkin.
Masalan:
Trailing comma
Massiv, obyekt kabi, vergul bilan tugashi mumkin:
"Trailing comma" uslubi elementlarni qo'shish/olish osonroq qiladi, chunki barcha qatorlar bir xil bo'ladi.
Oxirgi elementlarni "at" bilan olish
Bu yangi qo'shilgan xususiyat.
Agar massivning oxirgi elementini olishni istasak:
Ba'zi dasturlash tillari negativ indekslar yordamida bu maqsadni bajarishga ruxsat beradi, masalan fruits[-1]
.
JavaScript'da bu ishlamaydi. Natija undefined
bo'ladi, chunki indeks kvadrat qavslar ichida bevosita olinadi.
Oxirgi element indeksini aniq hisoblashimiz mumkin va shundan foydalanishimiz mumkin: fruits[fruits.length - 1]
.
Bir oz noqulay, shunday emasmi? Biz o'zgaruvchining nomini ikki marta yozishimiz kerak.
Yaxshi yangilik: qisqaroq sintaksis mavjud: fruits.at(-1)
:
Demak, arr.at(i)
:
i >= 0
bo'lsa,arr[i]
bilan bir xil.- Negativ
i
qiymatlari uchun, massivning oxiridan orqaga qadam qo'yadi.
pop/push, shift/unshift metodlari
Massivlar ko'pincha "queue" (navbat) ma'lumotlar tuzilmasi sifatida ishlatiladi. Bu, kompyuter fanida, tartiblangan elementlar to'plamidir va ikkita amaliyotni qo'llab-quvvatlaydi:
push
- elementni oxiriga qo'shadi.shift
- boshlanishdan elementni oladi, navbatni oldinga siljitib, 2-chi elementni 1-chi qilish.
Massivlar ushbu ikkita operatsiyani qo'llab-quvvatlaydi.
Ko'pincha buni amalga oshirish zarurati tug'iladi. Misol uchun, ekranlarda ko'rsatilishi kerak bo'lgan xabarlar navbati.
Massivlar yana bir ma'lumotlar tuzilmasi - "stack" (stak) sifatida ishlatilishi mumkin.
Bu ikkita operatsiyani qo'llab-quvvatlaydi:
push
- elementni oxiriga qo'shadi.pop
- elementni oxiridan oladi.
Shunday qilib, yangi elementlar faqat "oxiridan" qo'shiladi yoki olinadi.
Stak ko'pincha kartalar to'plami sifatida tasvirlanadi: yangi kartalar yuqoriga qo'shiladi yoki yuqoridan olinadi.
Stakda eng oxirgi qo'shilgan element birinchi bo'lib olinadi, bu LIFO (Last-In-First-Out) prinsipiga mos keladi. Navbatda FIFO (First-In-First-Out) prinsipiga mos keladi.
JavaScript'dagi massivlar navbat va stak sifatida ishlatilishi mumkin. Ular elementlarni qo'shish/olish imkonini beradi, boshlanishidan yoki oxiridan.
"Deque" deb ataladigan ma'lumotlar tuzilmasi bu imkoniyatni taqdim etadi.
Oxiridagi metodlar:
pop
Massivning oxirgi elementini olib, qaytaradi:
fruits.pop()
va fruits.at(-1)
ikkalasi ham massivning oxirgi elementini qaytaradi, lekin fruits.pop()
massivni o'zgartiradi va uni olib tashlaydi.
push
Elementni massivning oxiriga qo'shadi:
fruits.push(...)
fruits[fruits.length] = ...
bilan tengdir.
shift
Massivning birinchi elementini olib, qaytaradi:
unshift
Elementni massivning boshlanishiga qo'shadi:
push
va unshift
metodlari bir vaqtning o'zida bir nechta element qo'shishi mumkin:
Internals
Massiv - maxsus obyekt turidir. Massivni arr[0]
kabi kvadrat qavslar yordamida olish obyekt sintaksisidan kelib chiqadi. Bu aslida obj[key]
kabi, bu yerda arr
obyekt, raqamlar esa kalit sifatida ishlatiladi.
Massivlar obyektlarni kengaytiradi, tartiblangan ma'lumotlar to'plamlarini ishlash uchun maxsus metodlar va uzunlik xususiyatini taqdim etadi. Ammo asosan bu obyekt sifatida ishlaydi.
JavaScript'da sakkizta asosiy ma'lumot turi mavjud (ko'proq ma'lumot uchun Ma'lumot turlari bo'limiga qarang). Massiv obyekt bo'lib, shuning uchun obyekt sifatida ishlaydi.
Misol uchun, massiv havola orqali nusxalanadi:
Ammo massivlarni haqiqatan ham maxsus qiladigan narsa ularning ichki ko'rsatmasidir. Dastur o'z elementlarini ketma-ket xotira hududida saqlashga harakat qiladi, bu bobdagi tasvirlar singari, va boshqa optimallashtirishlar ham mavjud, massivlar juda tez ishlashi uchun.
Lekin agar biz massivni "tartiblangan to'plam" sifatida ishlashni to'xtatib, uni oddiy obyekt sifatida ishlatsak, barcha optimallashtirishlar buziladi.
Masalan, texnik jihatdan biz buni amalga oshirishimiz mumkin:
Bu mumkin, chunki massivlar asosan obyektlardir. Ularga har qanday xususiyat qo'shishimiz mumkin.
Lekin dastur massivni oddiy obyekt sifatida ko'radi. Massivga xos optimallashtirishlar bu holat uchun mos kelmaydi va ular o'chiriladi, shuning uchun ularning foydalari yo'qoladi.
Massivlarni noto'g'ri ishlatish usullari:
- Raqamli bo'lmagan xususiyat qo'shish, masalan
arr.test = 5
. - Bo'sh joylar yaratish, masalan:
arr[0]
qo'shish va keyinarr[1000]
qo'shish (va ularning orasida hech narsa bo'lmaydi). - Massivni teskari tartibda to'ldirish, masalan
arr[1000]
,arr[999]
va hokazo.
Massivlarni tartiblangan ma'lumotlar bilan ishlash uchun maxsus strukturalar sifatida tasavvur qiling. Ular bu maqsad uchun maxsus metodlarni taqdim etadi. JavaScript dvigatellari massivlarni ketma-ket tartiblangan ma'lumotlar bilan ishlash uchun ehtiyotkorlik bilan sozlangan, shuning uchun ulardan shu tarzda foydalaning. Agar tasodifiy kalitlar kerak bo'lsa, ehtimol siz oddiy obyekt talab qilasiz.
Ishlash tezligi
push/pop
metodlari tez ishlaydi, shift/unshift
esa sekin.
Nega massivning oxirida ishlash boshida ishlashdan tezroq? Keling, bajarilish jarayonini ko'rib chiqamiz:
Index 0 bo'lgan elementni olib tashlash kifoya emas. Boshqa elementlar ham qayta raqamlanishi kerak.
shift
operatsiyasi 3 narsani bajarishi kerak:
- Index 0 bo'lgan elementni olib tashlash.
- Barcha elementlarni chapga ko'chirish, index 1 dan 0 gacha, 2 dan 1 gacha va hokazo.
- Uzunlik xususiyatini yangilash.
Massivda ko'proq elementlar bo'lsa, ularni ko'chirish uchun ko'proq vaqt ketadi, ko'proq xotira operatsiyalari.
unshift
bilan ham shunday. Massivning boshlanishiga element qo'shish uchun, avvalgi elementlarni o'ngga ko'chirishimiz kerak, ularning indekslarini oshirishimiz kerak.
push/pop
usullari nima bilan ishlaydi? Ular hech narsani ko'chirishlari shart emas. Oxiridan elementni olish uchun pop
metodi indeksni tozalaydi va uzunlikni qisqartiradi.
pop
operatsiyasi uchun bajariladigan harakatlar:
pop
metodi hech narsani ko'chirish kerak emas, chunki boshqa elementlar o'z indekslarini saqlaydi. Shuning uchun, bu juda tez ishlaydi.
push
metodida ham shunday.
Tsikl
Massiv elementlarini aylantirishning eng eski usullaridan biri bu indekslar bo'yicha for
tsiklidır:
Lekin massivlar uchun boshqa tsikl shakli mavjud, for..of
:
for..of
sizga joriy elementning raqamini bermaydi, faqat uning qiymatini beradi, lekin ko'p hollarda bu yetarli. Va bu qisqaroq.
Texnik jihatdan, massivlar obyektlar bo'lgani uchun, for..in
ni ham ishlatish mumkin:
Lekin bu aslida yaxshi fikr emas. Bunda ba'zi muammolar mavjud:
for..in
tsikli barcha xususiyatlarni iteratsiya qiladi, faqat raqamli bo'lganlarini emas.- Brauzerlar va boshqa muhitlarda "massivga o'xshash" obyektlar mavjud, ular massivlarga o'xshaydi. Ya'ni, ular uzunlik va indekslar xususiyatlariga ega, lekin ular boshqa raqamli bo'lmagan xususiyatlar va metodlarga ham ega bo'lishi mumkin, biz odatda ulardan foydalanmaymiz.
for..in
tsikli ularga ham qaraydi. Agar biz massivga o'xshash obyektlar bilan ishlashimiz kerak bo'lsa, bu "qo'shimcha" xususiyatlar muammo bo'lishi mumkin.
for..in
tsikli umumiy obyektlar uchun optimallashtirilgan, massivlar uchun emas, shuning uchun 10-100 baravar sekinroq ishlaydi. Albatta, bu hali ham juda tez. Tezlik faqat choklarda muhim bo'lishi mumkin. Shunga qaramay, farqni bilishimiz kerak.
Umuman olganda, massivlar uchun for..in
ishlatmaslik kerak.
Uzunlik haqida
Uzunlik xususiyati massivni o'zgartirganda avtomatik yangilanadi. Aniqrog'i, bu massivdagi qiymatlar soni emas, balki eng katta raqamli indeks plus bir.
Masalan, katta indeksdagi bitta element katta uzunlik beradi:
Odatda, biz massivlarni shunday ishlatmaymiz.
Uzunlik xususiyati haqida yana bir qiziqarli narsa, u yozilishi mumkin.
Agar biz uni qo'lda oshirsak, hech qanday qiziqarli narsa bo'lmaydi. Ammo agar biz qisqartirsak, massiv qisqaradi. Bu jarayon qaytarib bo'lmaydi, misol:
Shuning uchun, massivni tozalashning eng oddiy usuli: arr.length = 0;
.
new Array()
Massiv yaratish uchun yana bir sintaksis mavjud:
Bu
kamdan-kam ishlatiladi, chunki kvadrat qavslar []
qisqaroq. Shuningdek, unda bir qiziqarli xususiyat bor.
Agar new Array
faqat bitta argument bilan, bu son bo'lsa, u elementlarsiz, lekin berilgan uzunlik bilan massiv yaratadi.
Keling, qanday qilib o'zingizni o'qishingiz mumkinligini ko'ramiz:
Bunday kutilmagan natijalardan qochish uchun, odatda, kvadrat qavslarni ishlatamiz, agar biz haqiqatan ham nima qilayotganimizni bilmasak.
Ko'p o'lchovli massivlar
Massivlar boshqa massivlarni o'z ichiga olishi mumkin. Buni ko'p o'lchamli massivlar uchun, masalan, matritsalarni saqlash uchun ishlatishimiz mumkin:
toString
Massivlarning o'ziga xos toString
metodlari mavjud bo'lib, ularni vergul bilan ajratilgan ro'yxat sifatida qaytaradi.
Masalan:
Shuningdek, buni sinab ko'ring:
Massivlar Symbol.toPrimitive
yoki to'g'ri valueOf
'ga ega emas, ular faqat toString
konversiyasini amalga oshiradi, shuning uchun bu yerda []
bo'sh satrga, [1]
"1"
ga va [1,2]
"1,2"
ga aylanadi.
Agar ikkilik plus +
operatori stringga narsa qo'shsa, bu ham stringga aylantiradi, shuning uchun keyingi qadam quyidagicha bo'ladi:
Massivlarni solishtirmang
JavaScript'da, ba'zi boshqa dasturlash tillaridan farqli o'laroq, massivlarni ==
operatori bilan solishtirmang.
Bu operator massivlar uchun maxsus ishlov bermaydi, ularni har qanday obyektlar kabi ishlaydi.
Eslatib o'tamiz, qoidalar:
- Ikki obyekt
==
bilan faqat bir xil obyektlarga havola qilsalar tengdir. - Agar
==
ning bir argumenti obyekt bo'lsa, va ikkinchisi primitive bo'lsa, obyekt primitive ga konvertatsiya qilinadi, Ma'lumotni primitive ga konvertatsiya qilish bo'limida tushuntirilganidek.
… Null va undefined istisno, ular bir-biriga teng va boshqa hech narsaga teng emas.
Qattiq solishtirish ===
esa yanada sodda, chunki u turlarni konvertatsiya qilmaydi.
Shuning uchun, agar biz massivlarni ==
bilan solishtirsak, ular hech qachon teng bo'lmaydi, faqat ikkala o'zgaruvchi bir xil massivga havola qilsa.
Misol:
Bu massivlar texnik jihatdan turli obyektlardir. Shunday qilib, ular teng emas. ==
operatori elementlarni element-bo'yicha taqqoslamaydi.
Primitive bilan solishtirish ham ba'zan g'alati natijalarni berishi mumkin:
Bu yerda, ikkala holatda ham, biz primitive bilan massiv ob'ektini solishtiryapmiz. Shuning uchun massiv []
primitive uchun konvertatsiya qilinadi va bo'sh satr ''
ga aylanadi.
So'ngra, solishtirish jarayoni primitivlar bilan davom etadi, Ma'lumotlarni konvertatsiya qilish bo'limida tushuntirilganidek:
// []
bo'sh satrga aylantirilgandan so'ng
Shunday qilib, massivlarni qanday solishtirish kerak?
Bu juda oddiy: ==
operatoridan foydalanmang. Buning o'rniga, massivlarni item-bo'yicha solishtiring, tsikl orqali yoki keyingi bo'limda tushuntirilgan iteratsiya metodlaridan foydalanib.
Xulosa
Massiv - maxsus obyekt turidir, tartiblangan ma'lumotlarni saqlash va boshqarish uchun moslashgan.
Deklaratsiya:
- Kvadrat qavslar (odatiy)
new Array
(nadir hollarda)
Yagona argument bilan new Array
chaqirilsa, bu elementlarsiz, lekin berilgan uzunlik bilan massiv yaratadi.
Uzunlik xususiyati - massiv uzunligi yoki, aniqrog'i, uning oxirgi raqamli indeks plus bir. Bu massiv metodlari tomonidan avtomatik sozlanadi.
Agar biz uzunlikni qo'lda qisqartirsak, massiv qisqaradi.
Elementlarni olish:
- Elementni indeks orqali olishimiz mumkin, masalan,
arr[0]
at(i)
metodini ishlatish mumkin, bu manfiy indekslarni ruxsat etadi. Manfiyi
qiymatlari oxirdan orqaga qadam bosadi. Agari >= 0
, buarr[i]
bilan bir xil ishlaydi.
Massivni deque sifatida ishlatish mumkin:
push(...items)
- elementlarni oxiriga qo'shadi.pop()
- oxiridan elementni olib tashlaydi va qaytaradi.shift()
- boshlanishdan elementni olib tashlaydi va qaytaradi.unshift(...items)
- boshlanishga element qo'shadi.
Elementlarni tsikl orqali aylantirish:
for (let i=0; i<arr.length; i++)
– eng tezkor, eski brauzerlar bilan mos keladi.for (let item of arr)
– faqat qiymatlar uchun zamonaviy sintaksis,for (let i in arr)
– ishlatmang.
Massivlarni solishtirish uchun ==
operatoridan foydalanmang (shuningdek, >
, <
va boshqalar), chunki ular massivlarga maxsus ishlov bermaydi. Ular ularni har qanday obyektlar kabi ishlatadi, bu biz odatda xohlamaymiz.
Buning o'rniga, massivlarni item-bo'yicha solishtiring yoki keyingi bo'limda tushuntirilgan iteratsiya metodlaridan foydalaning.
Kelayotgan bo'limda biz massivlar va ularga qo'shish, olib tashlash, ajratish va saralash metodlarini o'rganamiz.