Shartlar — if/else, switch, ternary

~15 daq · JavaScript · Kirish va Asoslar

Muammodan boshlaylik

Dastur har doim bir yo'nalishda ketmaydi. Foydalanuvchi tizimga kirganmi? Mahsulot omborda bormi? Yosh 18 dan kattami? Bu savollarga qarab dastur turli yo'l tutadi.

Shartlar — dasturga "agar shunday bo'lsa, shuni qil; aks holda, buni qil" deb aytish usuli. Bu dasturlashning eng asosiy qismi — shartsiz dastur yozib bo'lmaydi.


if / else — asosiy qurilma

if — "agar" degani. Shart true bo'lsa — blok bajariladi, false bo'lsa — o'tkazib yuboriladi.

const yosh = 20;

if (yosh >= 18) {
  console.log("Katta yoshli"); // ← yosh 18 dan katta, shu bajariladi
}

else — "aks holda" degani. Shart false bo'lganda bajariladi:

const yosh = 15;

if (yosh >= 18) {
  console.log("Katta yoshli");
} else {
  console.log("Voyaga yetmagan"); // ← bu bajariladi
}

else if — bir nechta shart tekshirishda:

const ball = 75;

if (ball >= 90) {
  console.log("A'lo");
} else if (ball >= 70) {
  console.log("Yaxshi");   // ← bu bajariladi
} else if (ball >= 50) {
  console.log("Qoniqarli");
} else {
  console.log("Qoniqarsiz");
}

Shartlar yuqoridan pastga tekshiriladi. Birinchi true bo'lgan blok bajariladi, qolganlar o'tkazib yuboriladi.


Hayotiy o'xshatma

Tasavvur qiling: metro turnstiketi. Karta qo'ysangiz — pul yetarlimi tekshiradi. Yetarli bo'lsa — eshik ochiladi. Yetarli bo'lmasa — "Balans yetarli emas" deydi. Pul umuman bo'lmasa — "Karta topilmadi" deydi.

Bu aynan if / else if / else — har bir holat uchun alohida yo'l.


Nima uchun shunday?

Nima uchun {} qavslar kerak?

Texnik jihatdan bitta satr uchun qavslar shart emas:

if (yosh >= 18) console.log("Katta"); // ishlaydi

Lekin bu xavfli:

if (yosh >= 18)
  console.log("Katta");
  console.log("Tizimga kirish mumkin"); // ← bu DOIM bajariladi, shartga bog'liq emas!

Ikkinchi console.log shart ichida ko'rinsa ham — aslida tashqarida. Har doim {} ishlatiladi — xatolardan himoya qiladi.

Truthy va Falsy

if ichidagi shart har qanday qiymat bo'lishi mumkin — faqat true/false emas. JavaScript qiymatni boolean ga aylantiradi:

Falsy qiymatlar (false deb hisoblanadi):

if (0)         { } // bajarilmaydi
if ("")        { } // bajarilmaydi
if (null)      { } // bajarilmaydi
if (undefined) { } // bajarilmaydi
if (NaN)       { } // bajarilmaydi
if (false)     { } // bajarilmaydi

Truthy qiymatlar (true deb hisoblanadi — qolgan hamma narsa):

if (1)         { } // bajariladi
if ("salom")   { } // bajariladi
if ([])        { } // bajariladi — bo'sh massiv ham truthy!
if ({})        { } // bajariladi — bo'sh ob'ekt ham truthy!

switch — ko'p qiymat tekshirishda

Bitta o'zgaruvchini ko'p qiymat bilan taqqoslashda switch if/else if dan aniqroq ko'rinadi.

const kun = "Dushanba";

switch (kun) {
  case "Dushanba":
  case "Seshanba":
  case "Chorshanba":
  case "Payshanba":
  case "Juma":
    console.log("Ish kuni");  // ← bu bajariladi
    break;
  case "Shanba":
  case "Yakshanba":
    console.log("Dam olish kuni");
    break;
  default:
    console.log("Noto'g'ri kun");
}

break nima uchun kerak?

break — shu case bajarilgandan keyin switch dan chiqish. break bo'lmasa — keyingi case ham bajariladi (fall-through):

const daraja = 2;

switch (daraja) {
  case 1:
    console.log("Birinchi");
    // break yo'q!
  case 2:
    console.log("Ikkinchi"); // ← bajariladi
    // break yo'q!
  case 3:
    console.log("Uchinchi"); // ← bu ham bajariladi! daraja=2 bo'lsa ham
    break;
  case 4:
    console.log("To'rtinchi"); // ← bu bajarilmaydi
}
// Natija: "Ikkinchi", "Uchinchi"

Bu ko'pincha xato — lekin ba'zan ataylab ishlatiladi (yuqoridagi "Dushanba-Juma" misoli).

switch qachon, if/else qachon?

switch — bitta o'zgaruvchini aniq qiymatlar bilan taqqoslashda qulay. if/else — murakkab shartlarda, oraliq qiymatlar (>, <, >=) da kerak.

// switch uchun mos
switch (status) {
  case "active": ...
  case "inactive": ...
}

// if/else kerak — oraliq qiymat
if (temperature > 100) { ... }
else if (temperature > 37) { ... }

Ternary operator — qisqa yozuv

Ternary — uchta qismdan iborat: shart ? true_holat : false_holat.

const yosh = 20;
const holat = yosh >= 18 ? "Katta" : "Kichik";
console.log(holat); // "Katta"

Bu quyidagiga teng:

let holat;
if (yosh >= 18) {
  holat = "Katta";
} else {
  holat = "Kichik";
}

Ternary — qiymat qaytarish uchun. Qisqa, bir qatorda yoziladi.

Qachon ternary, qachon if/else?

// ✅ Ternary mos — oddiy qiymat tayinlash
const label = isAdmin ? "Admin" : "Foydalanuvchi";

// ✅ JSX da qulay
<div>{isLoggedIn ? <Dashboard /> : <Login />}</div>

// ❌ Ternary noto'g'ri — murakkab mantiq
const result = a > b
  ? (a > c ? doSomethingComplex() : doAnotherThing())
  : (b > c ? yetAnotherThing() : lastThing());
// Bu o'qib bo'lmaydi — if/else yaxshiroq

Ternary ichida ternary — o'qish qiyinlashadi. Bunday holda if/else ishlatiladi.


Short-circuit evaluation — qisqa tutashuv

&& va || operatorlari shartli bajarish uchun ham ishlatiladi:

// && — birinchi shart true bo'lsa, ikkinchisi bajariladi
isLoggedIn && showDashboard();

// || — birinchi shart false bo'lsa, ikkinchisi bajariladi
const name = inputName || "Mehmon";

Bu ternary ning yanada qisqa shakli — lekin faqat oddiy holatlarda o'qilishi oson.


Tez-tez uchraydigan xatolar

= o'rniga == yoki === yozish:

if (x = 5) { ... }  // ❌ bu tayinlash! x ga 5 yoziladi, shart doim true
if (x === 5) { ... } // ✅

break unutish:

switch (role) {
  case "admin":
    grantAdminAccess();
    // break yo'q!
  case "user":
    grantUserAccess(); // ← admin uchun ham bajariladi!
}

Bo'sh massivni false deb hisoblash:

const items = [];
if (!items) {
  console.log("Bo'sh"); // ❌ ishlamaydi — [] truthy
}
if (items.length === 0) {
  console.log("Bo'sh"); // ✅
}

Haddan ko'p else if — switch yaxshiroq:

// ❌ o'qish qiyin
if (color === "red") { ... }
else if (color === "green") { ... }
else if (color === "blue") { ... }
else if (color === "yellow") { ... }

// ✅ aniqroq
switch (color) {
  case "red": ...
  case "green": ...
  case "blue": ...
  case "yellow": ...
}

Xulosa

if/else — asosiy shartli qurilma. Murakkab shartlar, oraliq qiymatlar uchun.

switch — bitta o'zgaruvchini ko'p aniq qiymat bilan taqqoslashda. break unutilmaydi.

Ternary ? : — qisqa qiymat tayinlash uchun. Murakkab mantiqda if/else yaxshiroq.

Falsy qiymatlar: 0, "", null, undefined, NaN, false. Qolgan hamma narsa — truthy. Bo'sh massiv [] va ob'ekt {} — truthy.


Keyingi dars

7-dars: Sikllar — for, while, do-while, for...of, for...in