Koâpincha harakatlarni takrorlashga toâgâri keladi.
Masalan, roâyxatdan tovarlarni birin-ketin chiqarish yoki 1 dan 10 gacha boâlgan har bir raqam uchun bir xil kodni ishga tushirish.
Tsikllar â bir xil kodni bir necha marta takrorlash usuli.
Ilgâor oâquvchilar uchun kichik eâlon.
Bu maqola faqat asosiy tsikllarni qamrab oladi: while, do..while va for(..;..;..).
Agar siz bu maqolaga boshqa turdagi tsikllarni qidirib kelgan boâlsangiz, mana koârsatmalar:
- Obyekt xossalari boâylab tsikl uchun forâ¦in ga qarang.
- Massivlar va takrorlanadigan obyektlar boâylab tsikl uchun forâ¦of va iterables ga qarang.
Aks holda, davom eting.
âwhileâ tsikli
while tsikli quyidagi sintaksisga ega:
while (condition) {
// kod
// "tsikl tanasi" deb ataladi
}
condition haqiqiy boâlgan vaqtda, tsikl tanasidagi kod bajariladi.
Masalan, quyidagi tsikl i < 3 boâlgan vaqtda i ni chiqaradi:
let i = 0;
while (i < 3) {
// 0, keyin 1, keyin 2 ni ko'rsatadi
alert(i);
i++;
}
Tsikl tanasining bir marta bajarilishi iteratsiya deb ataladi. Yuqoridagi misoldagi tsikl uch marta iteratsiya qiladi.
Agar yuqoridagi misolda i++ boâlmaganida, tsikl (nazariy jihatdan) abadiy takrorlanar edi. Amalda brauzer bunday tsikllarni toâxtatish usullarini taqdim etadi va server tomonidagi JavaScript-da biz jarayonni toâxtatishimiz mumkin.
Faqat taqqoslashlar emas, har qanday ifoda yoki oâzgaruvchi tsikl sharti boâlishi mumkin: shart baholanadi va while tomonidan boolean ga aylantiriladi.
Masalan, while (i != 0) ni yozishning qisqaroq usuli while (i):
let i = 3;
while (i) { // i 0 ga aylanganida, shart yolg'on bo'ladi va tsikl to'xtaydi
alert( i );
i--;
}
Agar tsikl tanasi bitta iboraga ega boâlsa, jingalak qavslarni {â¦} tashlab qoâyishimiz mumkin:
let i = 3;
while (i) alert(i--);
âdoâ¦whileâ tsikli
Shart tekshiruvini do..while sintaksisi yordamida tsikl tanasining pastiga koâchirish mumkin:
do {
// tsikl tanasi
} while (condition);
Tsikl avval tanani bajaradi, keyin shartni tekshiradi va u haqiqiy boâlgan vaqtda uni qayta-qayta bajaradi.
Masalan:
let i = 0;
do {
alert(i);
i++;
} while (i < 3);
Bu sintaksis shakli faqat tsikl tanasini shart haqiqiy boâlishidan qatâiy nazar kamida bir marta bajarishni xohlagan vaqtda ishlatilishi kerak. Odatda boshqa shakl afzal koâriladi: while(â¦) {â¦}.
âforâ tsikli
for tsikli murakkabroq, lekin u eng koâp ishlatiladigan tsikldir.
U quyidagicha koârinadi:
for (begin; condition; step) {
// ... tsikl tanasi ...
}
Misolda bu qismlarning maânosini oârganamiz. Quyidagi tsikl i uchun 0 dan 3 gacha (lekin 3 ni oâz ichiga olmaydi) alert(i) ni ishga tushiradi:
for (let i = 0; i < 3; i++) {
// 0, keyin 1, keyin 2 ni ko'rsatadi
alert(i);
}
for ifodasini qism-qism koârib chiqamiz:
| qism | ||
|---|---|---|
| begin | let i = 0 |
Tsiklga kirishda bir marta bajariladi. |
| condition | i < 3 |
Har bir tsikl iteratsiyasidan oldin tekshiriladi. Agar yolgâon boâlsa, tsikl toâxtaydi. |
| body | alert(i) |
Shart haqiqiy boâlgan vaqtda qayta-qayta ishga tushadi. |
| step | i++ |
Har bir iteratsiyada tanadan keyin bajariladi. |
Umumiy tsikl algoritmi quyidagicha ishlaydi:
begin ni ishga tushiring
â (agar condition â body ni ishga tushiring va step ni ishga tushiring)
â (agar condition â body ni ishga tushiring va step ni ishga tushiring)
â (agar condition â body ni ishga tushiring va step ni ishga tushiring)
â ...
Yaâni, begin bir marta bajariladi, keyin iteratsiya qiladi: har bir condition testidan keyin body va step bajariladi.
Agar siz tsikllarga yangi boâlsangiz, misolga qaytib, uni qogâoz varaqida qadam-baqadam qanday ishlashini takrorlash yordam berishi mumkin.
Bizning holatimizda aynan nima sodir boâlishi:
// for (let i = 0; i < 3; i++) alert(i)
// begin ni ishga tushiring
let i = 0;
// agar condition â body ni ishga tushiring va step ni ishga tushiring
if (i < 3) {
alert(i);
i++;
}
// agar condition â body ni ishga tushiring va step ni ishga tushiring
if (i < 3) {
alert(i);
i++;
}
// agar condition â body ni ishga tushiring va step ni ishga tushiring
if (i < 3) {
alert(i);
i++;
}
// ...tugadi, chunki endi i == 3
Bu yerda âhisoblagichâ oâzgaruvchisi i toâgâridan-toâgâri tsiklda eâlon qilingan. Bu âinlineâ oâzgaruvchi eâloni deb ataladi. Bunday oâzgaruvchilar faqat tsikl ichida koârinadi.
for (let i = 0; i < 3; i++) {
alert(i); // 0, 1, 2
}
alert(i); // xato, bunday o'zgaruvchi yo'q
Oâzgaruvchi aniqlash oârniga, mavjud boâlganini ishlatishimiz mumkin:
let i = 0;
for (i = 0; i < 3; i++) { // mavjud o'zgaruvchini ishlatish
alert(i); // 0, 1, 2
}
alert(i); // 3, ko'rinadi, chunki tsikldan tashqarida e'lon qilingan
Qismlarni tashlab qoâyish
for ning har qanday qismini tashlab qoâyish mumkin.
Masalan, agar tsikl boshida hech narsa qilishga hojat boâlmasa, begin ni tashlab qoâyishimiz mumkin.
Bu yerda:
let i = 0; // bizda i allaqachon e'lon qilingan va tayinlangan
for (; i < 3; i++) {
// "begin" ga hojat yo'q
alert(i); // 0, 1, 2
}
step qismini ham olib tashlashimiz mumkin:
let i = 0;
for (; i < 3; ) {
alert(i++);
}
Bu tsiklni while (i < 3) ga bir xil qiladi.
Aslida hamma narsani olib tashlash mumkin, cheksiz tsikl yaratish:
for (;;) {
// cheksiz takrorlanadi
}
Eâtibor bering, for da ikkita nuqta-vergul ; boâlishi kerak. Aks holda sintaksis xatosi boâladi.
Tsiklni buzish
Odatda tsikl sharti yolgâon boâlganida chiqadi.
Lekin biz maxsus break direktivasi yordamida istalgan vaqtda chiqishni majburlab qoâyishimiz mumkin.
Masalan, quyidagi tsikl foydalanuvchidan bir qator raqamlarni soâraydi, hech qanday raqam kiritilmaganida âbuziladiâ:
let sum = 0;
while (true) {
let value = +prompt("Raqam kiriting", '');
if (!value) break; // (*)
sum += value;
}
alert( 'Yig\'indi: ' + sum );
break direktivasi (*) qatorida faollashadi, agar foydalanuvchi boâsh qator kiritsa yoki kiritishni bekor qilsa. U tsiklni darhol toâxtatadi va boshqaruvni tsikldan keyingi birinchi qatorga oâtkazadi. Yaâni, alert.
âCheksiz tsikl + kerak boâlganda breakâ kombinatsiyasi tsikl shartini tsiklning boshida yoki oxirida emas, balki oârtasida yoki hatto tananing bir necha joyida tekshirish kerak boâlgan vaziyatlar uchun juda yaxshi.
Keyingi iteratsiyaga davom eting
continue direktivasi break ning âengilroq versiyasiâ. U butun tsiklni toâxtatmaydi. Buning oârniga, u joriy iteratsiyani toâxtatadi va tsiklni yangisini boshlashga majbur qiladi (agar shart ruxsat bersa).
Agar joriy iteratsiya bilan ishimiz tugagan boâlsa va keyingisiga oâtishni istasak, undan foydalanishimiz mumkin.
Quyidagi tsikl faqat toq qiymatlarni chiqarish uchun continue dan foydalanadi:
for (let i = 0; i < 10; i++) {
// agar haqiqiy bo'lsa, tananing qolgan qismini tashlab o'ting
if (i % 2 == 0) continue;
alert(i); // 1, keyin 3, 5, 7, 9
}
i ning juft qiymatlari uchun continue direktivasi tanani bajarishni toâxtatadi va boshqaruvni for ning keyingi iteratsiyasiga (keyingi raqam bilan) oâtkazadi. Shunday qilib alert faqat toq qiymatlar uchun chaqiriladi.
continue direktivasi joylashishni kamaytiradiToq qiymatlarni koârsatadigan tsikl quyidagicha koârinishi mumkin:
for (let i = 0; i < 10; i++) {
if (i % 2) {
alert(i);
}
}
Texnik nuqtai nazardan, bu yuqoridagi misolga bir xil. Albatta, biz continue ishlatish oârniga kodni if blokiga oârashimiz mumkin.
Lekin yon taâsir sifatida, bu yana bir darajali joylashish yaratdi (alert chaqiruvi jingalak qavslar ichida). Agar if ichidagi kod bir necha qatordan uzun boâlsa, bu umumiy oâqish qobiliyatini kamaytirishi mumkin.
break/continue yoâqEâtibor bering, ifoda boâlmagan sintaksis konstruksiyalarni ternary operator ? bilan ishlatib boâlmaydi. Xususan, break/continue kabi direktivalarga u yerda ruxsat berilmaydi.
Masalan, agar biz ushbu kodni olsak:
if (i > 5) {
alert(i);
} else {
continue;
}
â¦va uni savol belgisi yordamida qayta yozsak:
(i > 5) ? alert(i) : continue; // continue bu yerda ruxsat etilmaydi
â¦u ishlamay qoladi: sintaksis xatosi bor.
Bu if oârniga savol belgisi operatori ? ishlatmaslikning yana bir sababi.
break/continue uchun yorliqlar
Baâzan biz bir vaqtning oâzida bir nechta ichma-ich tsikldan chiqishimiz kerak.
Masalan, quyidagi kodda biz i va j boâylab tsikl qilamiz, (0,0) dan (2,2) gacha koordinatalar (i, j) uchun soâraymiz:
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`(${i},${j}) koordinatalaridagi qiymat`, "");
// agar biz bu yerdan Done (pastga) chiqishni istasak nima qilamiz?
}
}
alert("Tugadi!");
Agar foydalanuvchi kiritishni bekor qilsa, jarayonni toâxtatish usuli kerak.
input dan keyingi oddiy break faqat ichki tsiklni buzadi. Bu yetarli emas â yorliqlar, yordam bering!
Yorliq â tsikldan oldin ikki nuqta bilan identifikator:
labelName: for (...) {
...
}
Quyidagi tsikldagi break <labelName> ifodasi yorliqqa chiqadi:
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`(${i},${j}) koordinatalaridagi qiymat`, '');
// agar bo'sh satr yoki bekor qilingan bo'lsa, ikkala tsikldan ham chiqing
if (!input) break outer; // (*)
// qiymat bilan biror narsa qiling...
}
}
alert('Tugadi!');
Yuqoridagi kodda break outer outer nomli yorliqni yuqorida qidiradi va oâsha tsikldan chiqadi.
Shunday qilib boshqaruv toâgâridan-toâgâri (*) dan alert('Tugadi!') ga oâtadi.
Yorliqni alohida qatorga ham koâchirishimiz mumkin:
outer:
for (let i = 0; i < 3; i++) { ... }
continue direktivasi ham yorliq bilan ishlatilishi mumkin. Bu holda, kod bajarish yorliqlangan tsiklning keyingi iteratsiyasiga oâtadi.
Yorliqlar koddagi ixtiyoriy joyga sakrashga ruxsat bermaydi.
Masalan, buni qilish mumkin emas:
break label; // pastdagi yorliqqa sakrash (ishlamaydi)
label: for (...)
break direktivasi kod bloki ichida boâlishi kerak. Texnik jihatdan, har qanday yorliqlangan kod bloki ishlaydi, masalan:
label: {
// ...
break label; // ishlaydi
// ...
}
â¦Garchi, vaqtning 99.9% da break tsikllar ichida ishlatiladi, yuqoridagi misollarda koârganimizdek.
continue faqat tsikl ichidan mumkin.
Xulosa
Biz 3 turdagi tsiklni koârib chiqdik:
whileâ Har bir iteratsiyadan oldin shart tekshiriladi.do..whileâ Har bir iteratsiyadan keyin shart tekshiriladi.for (;;)â Har bir iteratsiyadan oldin shart tekshiriladi, qoâshimcha sozlamalar mavjud.
âCheksizâ tsikl yaratish uchun odatda while(true) konstruksiyasi ishlatiladi. Bunday tsikl, boshqalar kabi, break direktivasi bilan toâxtatilishi mumkin.
Agar joriy iteratsiyada hech narsa qilishni istamasak va keyingisiga oâtishni istasak, continue direktivasidan foydalanishimiz mumkin.
break/continue tsikldan oldin yorliqlarni qoâllab-quvvatlaydi. Yorliq â break/continue ning ichma-ich tsikldan chiqib tashqi tsiklga oâtishining yagona usuli.
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â¦)