Shartlar, sikllar va funksiyalar

O'tgan darsda JavaScript'da qiymatlarni saqlash va hisoblashni o'rgandik. Endi dasturga «fikrlash»ni o'rgatamiz: shartga qarab qaror qabul qilish, ishni kerakli marta takrorlash va kodni qayta ishlatiladigan bo'laklarga — funksiyalarga ajratish. Bu uchtasi har qanday dasturning, jumladan, har qanday interaktiv sahifaning asosi.

Bu darsda

  • if, else if, else — qaror qabul qilish
  • Mantiqiy amallar &&, ||, !, ternar operator va switch
  • for va while sikllari, break va continue
  • for...of bilan satrni harfma-harf aylanib chiqish
  • Funksiyalar: parametrlar, return, standart qiymatlar
  • Strelkali funksiyalar va ko'rinish sohasi

if — «agar»

Algoritm darsida blok-sxemadagi rombni eslang: «Yomg'ir yog'yaptimi? Ha — soyabon ol». Dasturda bunday tanlov if («agar») bilan yoziladi. Shart qavs ichida, shart rost bo'lganda bajariladigan kod esa figurali qavslar { } ichida turadi:

const harorat = 32;

if (harorat > 30) {
  console.log("Bugun juda issiq!");
  console.log("Ko'proq suv iching.");
}

console.log("Ob-havo ma'lumoti tugadi.");

harorat ni 20 ga o'zgartiring — endi faqat oxirgi qator chiqadi, chunki shart false bo'ldi. Figurali qavslar ichidagi qatorlar blok deyiladi. Blok ichidagi qatorlar ikki bo'sh joy ichkariga surib yoziladi — JavaScript buni talab qilmaydi, lekin kod ancha oson o'qiladi.

else — «aks holda»

Shart bajarilmaganda boshqa ish qilish uchun else qo'shiladi. Ikki yo'ldan faqat bittasi bajariladi:

if va else: shart rost bo'lsa bir yo'l, yolg'on bo'lsa boshqa yo'l bajariladi, keyin dastur davom etadi const yosh = 15; yosh >= 18 ? true if bloki false else bloki davom etish
if...else: ikki yo'ldan biri tanlanadi, keyin dastur bitta joyda davom etadi.
const yosh = 15;

if (yosh >= 18) {
  console.log("Siz saylovda ovoz bera olasiz.");
} else {
  console.log(`Ovoz berishingizga ${18 - yosh} yil qoldi.`);
}

else if — bir nechta variant

Variantlar ikkitadan ko'p bo'lsa, else if («aks holda, agar») ishlatiladi. Shartlar yuqoridan pastga tekshiriladi va birinchi rost shartning bloki bajariladi, qolganlari tekshirilmaydi ham:

const soat = 14;

if (soat < 12) {
  console.log("Xayrli tong!");
} else if (soat < 18) {
  console.log("Xayrli kun!");
} else if (soat < 22) {
  console.log("Xayrli kech!");
} else {
  console.log("Xayrli tun!");
}

14 < 12? Yo'q. 14 < 18? Ha — «Xayrli kun!» chiqadi va shu bilan tamom. Ikkinchi shartda soat >= 12 && soat < 18 deb yozish shart emas: soat 12 dan kichik bo'lganida, birinchi shart allaqachon ishlagan bo'lardi. soat ga turli qiymatlar berib ko'ring.

Mantiqiy amallar: &&, ||, !

Bir nechta shartni birlashtirish uchun mantiqiy amallar ishlatiladi:

AmalMa'nosiQachon true
&&«va»Ikkala shart ham rost bo'lsa
||«yoki»Kamida bittasi rost bo'lsa
!«emas»Shart yolg'on bo'lsa (teskarisiga aylantiradi)

Barcha holatlar — rostlik jadvalida:

aba && ba || b!a
truetruetruetruefalse
truefalsefalsetruefalse
falsetruefalsetruetrue
falsefalsefalsefalsetrue
const yosh = 20;
const chiptaBor = true;
const damOlishKuni = false;

if (yosh >= 18 && chiptaBor) {
  console.log("Kinoga kirishingiz mumkin.");
}

if (yosh < 7 || yosh >= 65) {
  console.log("Sizga chegirma bor!");
} else {
  console.log("Chipta to'liq narxda.");
}

if (!damOlishKuni) {
  console.log("Bugun ish kuni — seans kechqurun.");
}

| belgisi (vertikal chiziq) klaviaturada odatda Enter ustidagi \ tugmasida turadi: Shift + \. || uchun uni ikki marta bosing.

Ternar operator — qisqa if

Ikki qiymatdan birini tanlash kerak bo'lsa, shart ? agarRost : agarYolgon ko'rinishidagi qisqa yozuv bor. U ternar operator («uch qismli amal») deyiladi:

const son = 7;
const turi = son % 2 === 0 ? "juft" : "toq";
console.log(`${son} — ${turi} son`);

const ball = 64;
console.log(ball >= 60 ? "Imtihondan o'tdingiz" : "Qayta topshirasiz");

Ternar operatorni faqat qisqa va oddiy tanlovlar uchun ishlating. Murakkab shartlar uchun oddiy if...else tushunarliroq.

switch — bitta qiymatni ko'p variant bilan solishtirish

Bitta o'zgaruvchini ko'plab aniq qiymatlar bilan solishtirish kerak bo'lsa, switch ham ishlatiladi. Uni eski kodlarda tez-tez uchratasiz:

const kun = 3;

switch (kun) {
  case 1:
    console.log("Dushanba");
    break;
  case 2:
    console.log("Seshanba");
    break;
  case 3:
    console.log("Chorshanba");
    break;
  default:
    console.log("Boshqa kun");
}

Har bir case oxiridagi break shart: u bo'lmasa, keyingi variantlar ham ketma-ket bajarilib ketadi. default — hech qaysi variant mos kelmaganda. Ko'p hollarda if...else if yetarli.

Sikllar: ishni takrorlash

1 dan 100 gacha sonlarni chiqarish uchun 100 ta console.log yozish shart emas. Sikl (inglizcha loop) — kodni kerakli marta takrorlash usuli. Eng ko'p ishlatiladigani — for.

for sikli

for qavsi ichida nuqta-vergul bilan ajratilgan uchta qism bor:

for siklining uch qismi: boshlanish, shart va qadam for ( let i = 1; i <= 5; i++ ) { ... } 1. Boshlanish bir marta, eng boshida 2. Shart har aylanishdan oldin false bo'lsa — sikl tugaydi 3. Qadam har aylanishdan keyin i ni 1 ga oshiradi
for siklining tuzilishi.
for (let i = 1; i <= 5; i++) {
  console.log(`${i}-qadam`);
}
console.log("Sikl tugadi!");

Kompyuter bu kodni shunday bajaradi:

  1. let i = 1 — hisoblagich yaratiladi (bu faqat bir marta).
  2. i <= 5 tekshiriladi: 1 <= 5 rost — sikl tanasi bajariladi va «1-qadam» chiqadi.
  3. i++ — i 2 ga teng bo'ladi va yana 2-bandga qaytiladi.
  4. Shunday qilib 5 marta aylanadi. i 6 bo'lganda shart yolg'on bo'ladi va sikl tugaydi.

Uchala qismni o'zgartirib, turli sikllar hosil qilish mumkin:

// 7 ga ko'paytirish jadvali
for (let i = 1; i <= 10; i++) {
  console.log(`7 x ${i} = ${7 * i}`);
}

// 10 dan 0 gacha, 2 qadam bilan teskari sanash
for (let i = 10; i >= 0; i -= 2) {
  console.log(i);
}

while sikli

while («...ekan») — shart rost ekan, takrorlayveradi. Necha marta aylanishi oldindan noma'lum bo'lganda qulay. Masalan, omonatga 1 000 000 so'm qo'yildi, bank har yili 20% qo'shib beradi. Pul necha yilda ikki baravar ko'payadi?

let pul = 1000000;
let yil = 0;

while (pul < 2000000) {
  pul = pul * 1.2;   // har yili 20% o'sish
  yil++;
}

console.log(`${yil} yildan keyin pul ikki baravar ko'payadi.`);
console.log(`Hisobda: ${Math.round(pul)} so'm`);

Cheksiz sikldan ehtiyot bo'ling! Agar shart hech qachon yolg'on bo'lmasa, sikl to'xtamaydi va brauzer sahifasi qotib qoladi:

let i = 1;
while (i <= 5) {
  console.log(i);
  // i++ ni unutdik — i doim 1, shart doim rost!
}

Bu saytdagi muharrirlarda himoya bor: 2 soniyadan uzoq aylangan sikl avtomatik to'xtatiladi va konsolda ogohlantirish chiqadi. Haqiqiy brauzerda esa sahifa «javob bermayapti» bo'lib qoladi va tabni yopishga to'g'ri keladi. Shuning uchun sikl yozganda doim o'zingizdan so'rang: «Hisoblagich o'zgaryaptimi? Shart qachondir yolg'on bo'ladimi?»

for...of — satrni harfma-harf aylanib chiqish

for...of («...ning har biri uchun») satrdagi har bir belgini navbatma-navbat oladi. Hisoblagich kerak emas:

const soz = "Salom";
for (const harf of soz) {
  console.log(harf);
}

// "a" harfi necha marta uchraydi?
const matn = "Andijon, Samarqand, Namangan";
let soni = 0;
for (const harf of matn) {
  if (harf === "a" || harf === "A") {
    soni++;
  }
}
console.log(`"a" harfi ${soni} marta uchradi`);

Keyingi darsda for...of bilan ro'yxatlarni (massivlarni) ham aylanib chiqamiz — Massivlar va obyektlar.

break va continue

break siklni darhol to'xtatadi, continue esa joriy aylanishning qolgan qismini tashlab, keyingisiga o'tadi:

for (let i = 1; i <= 10; i++) {
  if (i % 3 === 0) {
    continue;   // 3, 6, 9 ni tashlab o'tamiz
  }
  if (i > 8) {
    break;      // 8 dan keyin siklni butunlay to'xtatamiz
  }
  console.log(i);
}

Natija: 1, 2, 4, 5, 7, 8. 3, 6 va 9 continue tufayli tashlab o'tildi, 10 da esa break siklni butunlay to'xtatdi.

Funksiyalar

Siz funksiyalarni allaqachon ishlatgansiz: console.log(), Math.round(), Number(). Funksiya (inglizcha function) — nomi bor, qayta-qayta ishlatiladigan kod bo'lagi. Endi o'zimiznikini yaratamiz.

Funksiya — oshpazlik retsepti. Uni bir marta yozib qo'yasiz, keyin xohlagancha «pishirasiz». Retseptga beriladigan masalliqlar — parametrlar, tayyor taom — qaytariladigan qiymat. Masalliq o'zgarsa (go'sht o'rniga tovuq), retsept o'sha-o'sha, lekin natija boshqacha.

Funksiya yaratish va chaqirish

function salomlash() {
  console.log("Assalomu alaykum!");
  console.log("Saytimizga xush kelibsiz.");
}

salomlash();   // funksiyani chaqirish
salomlash();   // yana bir marta

function kalit so'zidan keyin funksiya nomi, qavslar () va figurali qavslardagi tana yoziladi. Funksiyani yaratish (e'lon qilish) o'zi hech narsa qilmaydi — u faqat nomi va qavslar bilan chaqirilganda ishlaydi: salomlash().

Parametrlar va argumentlar

Funksiyaga qiymat berish uchun qavs ichiga parametr yoziladi. Chaqirishda berilgan aniq qiymat esa argument deyiladi:

function salomlash(ism) {          // ism — parametr
  console.log(`Salom, ${ism}!`);
}

salomlash("Ali");                  // "Ali" — argument
salomlash("Zarina");

function tanishtir(ism, shahar) {  // bir nechta parametr — vergul bilan
  console.log(`${ism} ${shahar}dan.`);
}
tanishtir("Bobur", "Andijon");

return — natijani qaytarish

Ko'pincha funksiya natijani konsolga chiqarmasdan, uni qaytarishi kerak — shunda natijani o'zgaruvchiga saqlash yoki boshqa hisobda ishlatish mumkin. Buning uchun return («qaytar») ishlatiladi:

function kvadrat(son) {
  return son * son;
}

const natija = kvadrat(5);
console.log(natija);                    // 25
console.log(kvadrat(3) + kvadrat(4));   // 9 + 16 = 25

// Taqqoslang: bu funksiya natijani faqat ko'rsatadi
function chiqar(son) {
  console.log(son * son);
}
const x = chiqar(5);   // konsolga 25 chiqadi...
console.log(x);        // ...lekin x — undefined!

console.log — natijani ko'rsatadi (faqat dasturchiga). return — natijani qaytaradi (dasturning keyingi qismiga). return siz funksiya undefined qaytaradi. Yana bir muhim narsa: return bajarilishi bilan funksiya darhol tugaydi — undan keyingi qatorlar ishlamaydi.

Standart qiymatli parametrlar

Parametrga = bilan standart qiymat berish mumkin. Argument berilmasa, shu qiymat ishlatiladi:

function salomlash(ism = "mehmon") {
  console.log(`Salom, ${ism}!`);
}

salomlash("Bobur");   // Salom, Bobur!
salomlash();          // Salom, mehmon!

Strelkali funksiyalar

Zamonaviy JavaScript'da funksiyaning qisqa yozuvi ham bor — strelkali funksiya (inglizcha arrow function). U => belgisi bilan yoziladi:

// Oddiy funksiya
function kvadrat(x) {
  return x * x;
}

// Xuddi shu — strelkali funksiya
const kvadrat2 = (x) => x * x;

const qoshish = (a, b) => a + b;
const salom = () => console.log("Salom!");

// Ko'p qatorli tana bo'lsa — figurali qavs va return kerak
const ortacha = (a, b) => {
  const yigindi = a + b;
  return yigindi / 2;
};

console.log(kvadrat(6), kvadrat2(6));
console.log(qoshish(2, 3));
salom();
console.log(ortacha(4, 9));

Tana bitta ifodadan iborat bo'lsa, figurali qavs va return yozilmaydi — ifodaning qiymati o'zi qaytariladi. Strelkali funksiyalar DOM va hodisalar bilan ishlaganda juda ko'p uchraydi.

Ko'rinish sohasi (scope)

let va const bilan blok yoki funksiya ichida yaratilgan o'zgaruvchi faqat o'sha figurali qavslar ichida «ko'rinadi». Bu ko'rinish sohasi (inglizcha scope) deyiladi. Tashqarida yaratilgan o'zgaruvchi esa ichkarida ham ko'rinadi:

const shahar = "Toshkent";      // tashqarida — hamma joyda ko'rinadi

function tanishtir() {
  const ism = "Jasur";          // faqat funksiya ichida ko'rinadi
  console.log(`${ism} ${shahar}da yashaydi.`);
}

tanishtir();
console.log(shahar);
console.log(ism);   // XATO: ism bu yerda ko'rinmaydi

Oxirgi qatorda ReferenceError: ism is not defined — «ism aniqlanmagan» xatosi chiqdi. Bu foydali cheklov: har bir funksiya o'z «xonasida» ishlaydi va boshqa joydagi bir xil nomli o'zgaruvchilarni tasodifan buzib qo'ymaydi.

Python'ni bilsangiz

Agar Python kursidagi shartlar, while, for va funksiyalar darslarini o'tgan bo'lsangiz, g'oyalar o'sha-o'sha — faqat yozilishi boshqacha:

PythonJavaScript
Blok — chekinish va :Blok — figurali qavslar { }
if x > 5:if (x > 5) { ... }
elifelse if
and, or, not&&, ||, !
for i in range(1, 6):for (let i = 1; i <= 5; i++) { ... }
for harf in soz:for (const harf of soz) { ... }
def kvadrat(x):function kvadrat(x) { ... }
lambda x: x * x(x) => x * x

Mashqlar

1-mashq UchBesh

Dasturchilar orasida mashhur masala. 1 dan 15 gacha sonlarni chiqaring, lekin:

  • 3 ga bo'linadigan son o'rniga Uch,
  • 5 ga bo'linadigan son o'rniga Besh,
  • ham 3 ga, ham 5 ga bo'linadigan son o'rniga UchBesh chiqsin.
for (let i = 1; i <= 15; i++) {
  // shu yerda tekshiring
  console.log(i);
}
Ishora

Bo'linishni qoldiq bilan tekshiring: i % 3 === 0. Tartib muhim: avval «ham 3 ga, ham 5 ga» holatini tekshiring (&& bilan), aks holda 15 uchun «Uch» chiqib ketadi.

Yechimni ko'rish
for (let i = 1; i <= 15; i++) {
  if (i % 3 === 0 && i % 5 === 0) {
    console.log("UchBesh");
  } else if (i % 3 === 0) {
    console.log("Uch");
  } else if (i % 5 === 0) {
    console.log("Besh");
  } else {
    console.log(i);
  }
}

2-mashq 1 dan 100 gacha yig'indi

Sikl yordamida 1 + 2 + 3 + ... + 100 yig'indisini hisoblang va Yig'indi: 5050 deb chiqaring.

let yigindi = 0;
// sikl yozing

Ishora

Sikl ichida har bir i ni yigindi ga qo'shib boring: yigindi += i;. Natijani sikldan keyin bir marta chiqaring.

Yechimni ko'rish
let yigindi = 0;
for (let i = 1; i <= 100; i++) {
  yigindi += i;
}
console.log(`Yig'indi: ${yigindi}`);

3-mashq juftmi() funksiyasi

juftmi(son) funksiyasini yozing: son juft bo'lsa true, toq bo'lsa false qaytarsin (konsolga chiqarmasin — buni pastdagi qatorlar qiladi).

function juftmi(son) {
  // shu yerga yozing
}

console.log(juftmi(4));    // true
console.log(juftmi(7));    // false
console.log(juftmi(0));    // true
console.log(juftmi(-3));   // false
Ishora

Taqqoslashning o'zi true yoki false beradi. Shuning uchun if ham shart emas: return son % 2 === 0;

Yechimni ko'rish
function juftmi(son) {
  return son % 2 === 0;
}

console.log(juftmi(4));    // true
console.log(juftmi(7));    // false
console.log(juftmi(0));    // true
console.log(juftmi(-3));   // false

4-mashq Baho qo'yuvchi funksiya

baho(ball) funksiyasini yozing. U 100 ballik natijani 5 ballik bahoga aylantirib qaytarsin: 86–100 → 5, 71–85 → 4, 56–70 → 3, 55 va undan past → 2.

function baho(ball) {
  // shu yerga yozing
}

console.log(baho(95));   // 5
console.log(baho(86));   // 5
console.log(baho(78));   // 4
console.log(baho(56));   // 3
console.log(baho(30));   // 2
Yechimni ko'rish
function baho(ball) {
  if (ball >= 86) {
    return 5;
  } else if (ball >= 71) {
    return 4;
  } else if (ball >= 56) {
    return 3;
  } else {
    return 2;
  }
}

console.log(baho(95));   // 5
console.log(baho(86));   // 5
console.log(baho(78));   // 4
console.log(baho(56));   // 3
console.log(baho(30));   // 2

return funksiyani darhol tugatgani uchun else larni yozmasa ham bo'ladi: if (ball >= 86) return 5; dan keyin keyingi qator faqat ball 86 dan kichik bo'lgandagina bajariladi.

O'zingizni sinang

5 > 3 && 2 > 4 ifodasining qiymati qanday?

  1. true
  2. false
  3. undefined
  4. Xato chiqadi

To'g'ri. && uchun ikkala shart ham rost bo'lishi kerak, 2 > 4 esa yolg'on.

Quyidagi kod konsolga nima chiqaradi?

for (let i = 0; i < 3; i++) {
  console.log(i);
}
  1. 1, 2, 3
  2. 0, 1, 2, 3
  3. 3
  4. 0, 1, 2

To'g'ri. i 0 dan boshlanadi, i 3 bo'lganda i < 3 yolg'on bo'lib, sikl tugaydi.

Sikl ichidagi break nima qiladi?

  1. Siklni darhol butunlay to'xtatadi
  2. Faqat joriy aylanishni tashlab, keyingisiga o'tadi
  3. Siklni boshidan qayta boshlaydi
  4. Dasturni xato bilan tugatadi

To'g'ri. Joriy aylanishni tashlab o'tish — bu continue ning ishi.

Ushbu koddan keyin n ning qiymati nima bo'ladi?

function ikkiBaravar(x) {
  console.log(x * 2);
}
const n = ikkiBaravar(5);
  1. 10
  2. 5
  3. undefined
  4. "10"

To'g'ri. Funksiya 10 ni konsolga chiqaradi, lekin hech narsa return qilmaydi, shuning uchun undefined qaytaradi.

const kub = (x) => x ** 3; bo'lsa, kub(2) nimaga teng?

  1. 6
  2. 8
  3. 9
  4. undefined, chunki return yozilmagan

To'g'ri. Bir qatorli strelkali funksiya ifodaning qiymatini o'zi qaytaradi: 2 × 2 × 2 = 8.

Xulosa

  • if (shart) { }, else if, else — birinchi rost shartning bloki bajariladi.
  • && — «va», || — «yoki», ! — «emas». Qisqa tanlov uchun — shart ? a : b.
  • for (boshlanish; shart; qadam) — necha marta aylanishi ma'lum bo'lganda, while (shart) — noma'lum bo'lganda. Shart qachondir yolg'on bo'lishiga ishonch hosil qiling.
  • for...of — satr (va massiv) elementlarini birma-bir oladi. break — to'xtatadi, continue — keyingisiga o'tadi.
  • Funksiya: function nom(parametr) { return natija; }. return qiymatni qaytaradi, console.log faqat ko'rsatadi.
  • Strelkali funksiya: const kvadrat = (x) => x * x;. Blok ichida yaratilgan let/const faqat o'sha blokda ko'rinadi.