25 август 2025

Mantiqiy operatorlar

JavaScript-da to’rtta mantiqiy operator mavjud: || (YOKI), && (VA), ! (EMAS), ?? (Nullish Coalescing). Bu yerda biz birinchi uchta operatorni ko’rib chiqamiz, ?? operator keyingi maqolada yoritilgan.

Ular “mantiqiy” deb atalsa ham, ular faqat boolean tipidagi qiymatlargagina emas, balki har qanday tipdagi qiymatlarga ham qo’llanilishi mumkin. Ularning natijasi ham har qanday tipda bo’lishi mumkin.

Keling, batafsil ko’rib chiqamiz.

|| (YOKI)

“YOKI” operatori ikki vertikal chiziq belgisi bilan ifodalanadi:

result = a || b;

Klassik dasturlashda, mantiqiy YOKI faqat boolean qiymatlar bilan ishlash uchun mo’ljallangan. Agar argumentlaridan biri true bo’lsa, u true qaytaradi, aks holda false qaytaradi.

JavaScript-da esa bu operator biroz murakkabroq va kuchlidir. Lekin avval boolean qiymatlar bilan nima sodir bo’lishini ko’rib chiqaylik.

To’rtta mumkin bo’lgan mantiqiy kombinatsiya mavjud:

alert(true || true); // true
alert(false || true); // true
alert(true || false); // true
alert(false || false); // false

Ko’rib turganingizdek, ikkala operand ham false bo’lgan holdan tashqari, natija har doim true bo’ladi.

Agar operand boolean bo’lmasa, u baholash uchun boolean tipiga aylantiriladi.

Masalan, 1 raqami true sifatida, 0 raqami esa false sifatida qaraladi:

if (1 || 0) {
  // xuddi if( true || false ) kabi ishlaydi
  alert("haqiqiy!");
}

Ko’pincha, YOKI || operatori if ifodasida berilgan shartlardan birortasi true ekanligini tekshirish uchun ishlatiladi.

Masalan:

let hour = 9;

if (hour < 10 || hour > 18) {
  alert( 'Ofis yopiq.' );
}

Ko’proq shartlarni ham qo’shishimiz mumkin:

let hour = 12;
let isWeekend = true;

if (hour < 10 || hour > 18 || isWeekend) {
  alert("Ofis yopiq."); // dam olish kuni
}

YOKI "||" birinchi haqiqiy qiymatni topadi

Yuqorida tasvirlangan mantiq biroz klassikdir. Endi keling, JavaScript-ning “qo’shimcha” xususiyatlarini ko’rib chiqaylik.

Kengaytirilgan algoritm quyidagicha ishlaydi.

Bir nechta YOKI bilan birlashtirilgan qiymatlar berilgan:

result = value1 || value2 || value3;

YOKI || operatori quyidagicha ishlaydi:

  • Operandlarni chapdan o’ngga qarab baholaydi.
  • Har bir operand uchun uni boolean tipiga aylantiradi. Agar natija true bo’lsa, to’xtaydi va o’sha operandning asl qiymatini qaytaradi.
  • Agar barcha operandlar baholangan bo’lsa (ya’ni hammasi false bo’lsa), oxirgi operandni qaytaradi.

Qiymat aylantirishsiz, asl shaklida qaytariladi.

Boshqacha qilib aytganda, YOKI || zanjirlari birinchi haqiqiy qiymatni yoki agar haqiqiy qiymat topilmasa, oxirgi qiymatni qaytaradi.

Masalan:

alert(1 || 0); // 1 (1 haqiqiy)

alert(null || 1); // 1 (1 birinchi haqiqiy qiymat)
alert(null || 0 || 1); // 1 (birinchi haqiqiy qiymat)

alert(undefined || null || 0); // 0 (hammasi yolg'on, oxirgi qiymatni qaytaradi)

Bu “sof, klassik, faqat-boolean YOKI” bilan solishtirganda qiziqarli foydalanish imkoniyatlarini beradi.

  1. O’zgaruvchilar yoki ifodalar ro’yxatidan birinchi haqiqiy qiymatni olish.

    Masalan, bizda firstName, lastName va nickName o’zgaruvchilari bor, ularning barchasi ixtiyoriy (ya’ni undefined yoki yolg’on qiymatlarga ega bo’lishi mumkin).

    Ma’lumotga ega bo’lgan birini tanlash va uni ko’rsatish uchun YOKI || dan foydalanamiz (yoki agar hech narsa o’rnatilmagan bo’lsa "Anonymous"):

    let firstName = "";
    let lastName = "";
    let nickName = "SuperCoder";
    
    alert( firstName || lastName || nickName || "Anonymous"); // SuperCoder

    Agar barcha o’zgaruvchilar yolg’on bo’lsa, "Anonymous" ko’rinadi.

  2. Qisqa tutashuv baholashi.

    YOKI || operatorining yana bir xususiyati “qisqa tutashuv” baholashidir.

    Bu shuni anglatadiki, || o’z argumentlarini birinchi haqiqiy qiymatga yetguncha qayta ishlaydi, keyin qiymat darhol qaytariladi, boshqa argumentga tegmasdan turib.

    Bu xususiyatning ahamiyati, agar operand oddiy qiymat emas, balki o’zgaruvchi tayinlash yoki funksiya chaqiruvi kabi yon ta’sirli ifoda bo’lsa yaqqol ko’rinadi.

    Quyidagi misolda faqat ikkinchi xabar chop etiladi:

    true || alert("chop etilmaydi");
    false || alert("chop etiladi");

    Birinchi qatorda YOKI || operatori true ni ko’rishi bilanoq baholashni darhol to’xtatadi, shuning uchun alert bajarilmaydi.

    Ba’zan odamlar bu xususiyatdan faqat chap qismidagi shart yolg’on bo’lgandagina buyruqlarni bajarish uchun foydalanadilar.

&& (VA)

VA operatori ikki ampersand && bilan ifodalanadi:

result = a && b;

Klassik dasturlashda VA ikkala operand ham haqiqiy bo’lsa true, aks holda false qaytaradi:

alert(true && true); // true
alert(false && true); // false
alert(true && false); // false
alert(false && false); // false

if bilan misol:

let hour = 12;
let minute = 30;

if (hour == 12 && minute == 30) {
  alert("Vaqt 12:30");
}

YOKI kabi, VA operandiga ham har qanday qiymat ruxsat etilgan:

if (1 && 0) {
  // true && false sifatida baholanadi
  alert("ishlamaydi, chunki natija yolg'on");
}

VA “&&” birinchi yolg’on qiymatni topadi

Bir nechta VA bilan birlashtirilgan qiymatlar berilgan:

result = value1 && value2 && value3;

VA && operatori quyidagicha ishlaydi:

  • Operandlarni chapdan o’ngga qarab baholaydi.
  • Har bir operand uchun uni boolean tipiga aylantiradi. Agar natija false bo’lsa, to’xtaydi va o’sha operandning asl qiymatini qaytaradi.
  • Agar barcha operandlar baholangan bo’lsa (ya’ni hammasi haqiqiy bo’lsa), oxirgi operandni qaytaradi.

Boshqacha qilib aytganda, VA birinchi yolg’on qiymatni yoki agar topilmasa, oxirgi qiymatni qaytaradi.

Yuqoridagi qoidalar YOKI ga o’xshash. Farqi shundaki, VA birinchi yolg’on qiymatni qaytaradi, YOKI esa birinchi haqiqiy qiymatni qaytaradi.

Misollar:

// agar birinchi operand haqiqiy bo'lsa,
// VA ikkinchi operandni qaytaradi:
alert(1 && 0); // 0
alert(1 && 5); // 5

// agar birinchi operand yolg'on bo'lsa,
// VA uni qaytaradi. Ikkinchi operand e'tiborga olinmaydi
alert(null && 5); // null
alert(0 && "farqi yo'q nima bo'lsa"); // 0

Shuningdek, bir nechta qiymatni ketma-ket o’tkazishimiz mumkin. Birinchi yolg’on qiymat qanday qaytarilishini ko’ring:

alert(1 && 2 && null && 3); // null

Barcha qiymatlar haqiqiy bo’lganda, oxirgi qiymat qaytariladi:

alert(1 && 2 && 3); // 3, oxirgisi
VA &&ning ustunligi YOKI||dan yuqori

VA&&operatorining ustunligi YOKI|| dan yuqoridir.

Shunday qilib, a && b || c && d kodi asosan && ifodalari qavs ichida bo’lgandek: (a && b) || (c && d).

if ni || yoki && bilan almashtirmang

Ba’zan odamlar VA && operatoridan “if yozishning qisqaroq usuli” sifatida foydalanadilar.

Masalan:

let x = 1;

(x > 0) && alert( 'Noldan katta!' );

&& ning o’ng qismidagi harakat faqat baholash unga yetsa bajariladi. Ya’ni, faqat (x > 0) haqiqiy bo’lsa.

Demak, bizda quyidagining o’xshashi bor:

let x = 1;

if (x > 0) alert( 'Noldan katta!' );

Garchi && li variant qisqaroq ko’rinsa ham, if aniqroq va biroz o’qishga osonroqdir. Shuning uchun biz har bir konstruksiyani o’z maqsadi uchun ishlatishni tavsiya qilamiz: agar if kerak bo’lsa if dan, VA kerak bo’lsa && dan foydalaning.

! (EMAS)

Boolean EMAS operatori undov belgisi ! bilan ifodalanadi.

Sintaksis juda oddiy:

result = !value;

Operator bitta argument qabul qiladi va quyidagicha ishlaydi:

  1. Operandni boolean tipiga aylantiradi: true/false.
  2. Teskari qiymatni qaytaradi.

Masalan:

alert(!true); // false
alert(!0); // true

Ikki marta EMAS !! ba’zan qiymatni boolean tipiga aylantirish uchun ishlatiladi:

alert(!!"bo'sh bo'lmagan satr"); // true
alert(!!null); // false

Ya’ni, birinchi EMAS qiymatni boolean ga aylantiradi va teskarisini qaytaradi, ikkinchi EMAS uni yana teskariga aylantiradi. Natijada bizda oddiy qiymat-dan-boolean-ga aylantirish bo’ladi.

Xuddi shu ishni qilishning biroz batafsil usuli bor – o’rnatilgan Boolean funksiyasi:

alert(Boolean("bo'sh bo'lmagan satr")); // true
alert(Boolean(null)); // false

EMAS ! ning ustunligi barcha mantiqiy operatorlar ichida eng yuqori, shuning uchun u har doim birinchi bo’lib, && yoki || dan oldin bajariladi.

Vazifalar

Quyidagi kod qanday natijani chiqaradi?

alert(null || 2 || undefined);

Javob 2, bu birinchi aniq qiymat.

alert(null || 2 || undefined);

Quyidagi kod nimani chiqaradi?

alert(alert(1) || 2 || alert(3));

Javob: avval 1, keyin 2.

alert(alert(1) || 2 || alert(3));

alert qiymatni qaytarmaydi. Yoki, boshqacha qilib aytganda, u undefined ni qaytaradi.

  1. Birinchi YOKI || chap operandni baholaydi alert(1). Bu birinchi xabarni 1 ko’rsatadi.
  2. alert undefined ni qaytaradi, shuning uchun YOKI ikkinchi operandga o’tib, haqiqiy qiymatni qidiradi.
  3. Ikkinchi operand 2 haqiqatdir, shuning uchun ijro to’xtatiladi, 2 qaytariladi va keyin tashqi ogohlantirish(alert) bilan ko’rsatiladi.

3 bo’lmaydi, chunki baholash alert(3) ga yetib bormaydi.

muhimlik: 5

Quyidagi kod nimani chiqaradi?

alert(1 && null && 2);

Javob: null, chunki bu ro’yxatdagi birinchi noto’g’ri qiymat.

alert(1 && null && 2);

Quyidagi kod nimani chiqaradi?

alert(alert(1) && alert(2));

Javob: 1, keyin undefined.

alert(alert(1) && alert(2));

alert ni chaqirish undefined ni qaytaradi (u shunchaki xabarni ko’rsatadi, shuning uchun mazmunli qaytish bo’lmaydi).

Shu sababli, && chap operandni baholaydi (1 ni qaytaradi) va darhol to’xtaydi, chunki undefined bu noto’g’ri qiymat. Va && noto’g’ri qiymatni qidiradi va uni qaytaradi.

Natija qanday bo’ladi?

alert(null || (2 && 3) || 4);

Javob: 3.

alert(null || (2 && 3) || 4);

VA && ning ustunligi YOKI || dan yuqori, shuning uchun u avval bajariladi.

2 && 3 = 3 natijasi, shuning uchun ifoda quyidagicha bo’ladi:

null || 3 || 4

Natijada birinchi to’g’ri qiymat: 3.

Age ning 14 dan 90 gacha bo’lganligini tekshirish uchun “if” shartini yozing.

“Gacha” degani, age 14 yoki 90 chekkalarga yetishi mumkin.

if (age >= 14 && age <= 90)

Age ning 14 dan 90 gacha bo’lmaganligini tekshirish uchun if shartini yozing.

Ikkita variant yarating: birinchisi YO’Q ! yordamida, ikkinchisi – usiz.

Birinchi variant:

if (!(age >= 14 && age <= 90))

Ikkinchi variant:

if (age < 14 || age > 90)

Ushbu alert lardan qaysi biri ijro etiladi?

If(...) ichida ifodalar natijalari qanday bo’ladi?

if (-1 || 0) alert("birinchi");
if (-1 && 0) alert("ikinchi");
if (null || (-1 && 1)) alert("uchinchi");

Javob: birinchi va uchinchisi ijro etiladi.

Tafsilotlar:

// Ishlaydi.
// -1 || 0 = -1 ning natijasi, to'g'ri
if (-1 || 0) alert("birinchi");

// Ishlamaydi.
// -1 && 0 = 0 ning natijasi, noto'g'ri
if (-1 && 0) alert("ikinchi");

// Ijro etiladi
// Operator && ning ustunligi || ga qaraganda yuqori
// Shunday qilib, birinchi navbatda -1 && 1 bajariladi:
// null || -1 && 1  ->  null || 1  ->  1
if (null || (-1 && 1)) alert("uchinchi");

prompt bilan kirish uchun kod yozing.

Agar mehmon "Admin" matnini kiritsa, u holda parol prompt orqali so’raladi, agar bo’sh satr yoki Esc bolsa – “Bekor qilindi” ko’rsatiladi, agar boshqa satr bo’lsa – “Men sizni tanimayman” ko’rsatiladi.

Parol quyidagicha tekshiriladi:

  • Agar u “Master” ga teng bo’lsa, unda “Xush kelibsiz!”,
  • Boshqa satr – “Noto’g’ri parol” ko’rsatiladi,
  • Bo’sh satr yoki bekor qilingan kiritish uchun “Bekor qilingdi” ko’rsatiladi.

Sxema:

Iltimos, ichki if bloklaridan foydalaning. Kodning umumiy o’qilishini yodda tuting.

Maslahat: so’rovga bo’sh matni kiritish, bo’sh matni '' qaytaradi. So’rov vaqtida ESC tugmasi bosish null ni qaytaradi.

Namoyishni ishga tushirish

let userName = prompt("Kim bu yerda?", "");

if (userName === "Admin") {
  let pass = prompt("Parol?", "");

  if (pass == "Master") {
    alert("Xush kelibsiz!");
  } else if (pass == "" || pass == null) {
    alert("Bekor qilindi.");
  } else {
    alert("Noto'g'ri parol");
  }
} else if (userName == "" || userName == null) {
  alert("Bekor qilindi");
} else {
  alert("Men sizni tanimayman");
}

If bloklar ichidagi vertikal chiziqlarga e’tibor bering. Ular texnik jihatdan talab qilinmaydi, lekin ular kodning o’qilishini yanada oson qiladilar.

O'quv qo'llanma xaritasi

Izohlar

izoh berishdan oldin buni o'qing…
  • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
  • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
  • Bir nechta so'z so'zlarini kiritish uchun <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…)