IlmHamroh
JavaScript Full-stack/8-qism. JavaScript asoslari14/61-dars16 daqiqa
Mundarija (33)

JavaScript mantiqiy operatorlar: &&, ||, ! va qisqa tutashuv

Qisqacha: Mantiqiy operatorlar shartlarni birlashtiradi: && (va) — ikkala tomon rost bo'lsa, || (yoki) — kamida bittasi rost bo'lsa rost, ! (emas) — qiymatni teskarisiga aylantiradi. Aslida && va || doim ham true/false qaytarmaydi. Ular tomonlardan birining o'zini qaytaradi va javob ma'lum bo'lishi bilan to'xtaydi — bu qisqa tutashuv deb ataladi.

Bu darsda

  • &&, || va ! bilan bir nechta shartni bitta ifodaga birlashtira olasiz.
  • && va || aslida nima qaytarishini tushuntira olasiz.
  • Qisqa tutashuv (short-circuit) nima ekanini va nega foydali ekanini bilasiz.
  • ism || "Mehmon" kabi default qiymat naqshini va uning tuzog'ini taniysiz.
  • De Morgan qonunlari bilan inkor qilingan shartlarni soddalashtira olasiz.

Oldin bilishingiz kerak: Boolean va truthy/falsy qiymatlar, Taqqoslash operatorlari, Tenglik: ==, === va Object.is.

1. Nega bu kerak?

O'tgan darsda ikki qiymatni === bilan solishtirishni o'rgandik. Lekin hayotda savollar ko'pincha bitta shartdan iborat bo'lmaydi.

Masalan, bankomatdan pul yechish. Bankomat ikki narsani tekshiradi: PIN kod to'g'rimi va kartada pul yetarlimi. Ikkalasi ham rost bo'lsagina pul beradi.

Metroga kirish esa boshqacha. Siz karta bilan yoki telefondagi QR-kod bilan o'tishingiz mumkin. Bittasi bo'lsa yetarli.

Shu paytgacha biz faqat bitta shartni tekshira olardik. Mantiqiy operatorlar esa bir nechta shartni birlashtiradi:

js
const pinTogri = true;
const balans = 300000;
const summa = 200000;

console.log(pinTogri && balans >= summa); // true

Bu qator "PIN to'g'ri va balans yetarlimi?" degan savolga javob beradi.

2. && — "va" (AND)

2.1 Ikkala tomon ham rost bo'lishi kerak

Mantiqiy operator (logical operator) — mantiqiy qiymatlar (true/false) ustida ishlaydigan operator. Birinchisi — &&, "va" deb o'qiladi. Uning natijasi faqat ikkala tomon ham true bo'lganda true bo'ladi.

Barcha to'rt holat:

a b a && b
true true true
true false false
false true false
false false false

Bunday jadval haqiqat jadvali (truth table) deb ataladi. U operatorning hamma mumkin bo'lgan natijasini ko'rsatadi.

js
console.log(true && true); // true
console.log(true && false); // false
console.log(false && true); // false
console.log(false && false); // false

2.2 Sonni oraliqda tekshirish

&& ning eng ko'p ishlatilishi — qiymat ikki chegara orasidami, shuni tekshirish. Masalan, test bali 60 dan 100 gacha bo'lsa, talaba o'tgan hisoblanadi:

js
const ball = 75;

console.log(ball >= 60 && ball <= 100); // true

JavaScript avval ikkala taqqoslashni hisoblaydi: 75 >= 60 — true, 75 <= 100 — true. Keyin true && true — true.

Diqqat: Matematikadagi kabi 60 <= ball <= 100 deb yozmang. JavaScript buni boshqacha tushunadi — bu haqda "Ko'p uchraydigan xatolar" bo'limida.

3. || — "yoki" (OR)

|| — "yoki" deb o'qiladi. Kamida bitta tomon true bo'lsa, natija true. Faqat ikkalasi ham false bo'lganda — false.

a b "yoki" natijasi
true true true
true false true
false true true
false false false

| belgisi klaviaturada odatda Enter tugmasi yonida, \ bilan bir tugmada turadi. Shift bilan bosiladi.

Misol: dam olish kunini aniqlaymiz. Kun shanba yoki yakshanba bo'lsa — dam olish:

js
const kun = "yakshanba";

console.log(kun === "shanba" || kun === "yakshanba"); // true

Birinchi taqqoslash false, ikkinchisi true. false || true — true.

Tekshirib ko'ring: const yosh = 15; bo'lsa, console.log(yosh >= 18 || yosh === 15) nima chiqaradi?

Javob

true. Birinchi shart 15 >= 18 — false. Ikkinchisi 15 === 15 — true. || uchun bitta true yetarli.

4. ! — "emas" (NOT)

! bitta qiymatni teskarisiga aylantiradi: true → false, false → true. U qiymatning oldiga yoziladi:

js
const bandmi = false;

console.log(!bandmi); // true
console.log(!true); // false

Haydovchi band emasmi? !bandmi — true, demak u bo'sh.

! har qanday qiymat bilan ishlaydi. Avval qiymatni truthy yoki falsy ekaniga qarab boolean'ga aylantiradi, keyin teskarisini oladi:

js
console.log(!""); // true
console.log(!"salom"); // false
console.log(!0); // true
console.log(!!"salom"); // true

Oxirgi qatorni eslang: ikkita !! — "ikki marta teskari", ya'ni qiymatning truthy yoki falsy ekanini true/false ko'rinishida beradi. Buni truthy/falsy darsida ko'rgansiz.

! doim true yoki false qaytaradi. && va || esa — yo'q. Bu keyingi bo'limning mavzusi.

Tekshirib ko'ring: console.log(!null) va console.log(!"0") nima chiqaradi?

Javob

!null — true, chunki null falsy. !"0" — false, chunki "0" bo'sh bo'lmagan satr, demak truthy. Ichida nol yozilgani ahamiyatsiz.

5. && va || aslida nima qaytaradi?

5.1 Ular tomonlardan birini qaytaradi

Endi darsning eng muhim qismi. Keling, && va || ni boolean bo'lmagan qiymatlar bilan sinab ko'ramiz:

js
console.log("Ali" || "Mehmon"); // Ali
console.log(null || "Mehmon"); // Mehmon
console.log("Ali" && "Vali"); // Vali
console.log(0 && "Vali"); // 0

Hech qayerda true yoki false chiqmadi! && va || natija sifatida tomonlardan birining o'zini qaytaradi. Qaysi birini — oddiy qoida bor.

a || b qoidasi: a truthy bo'lsa — a ni qaytaradi. Aks holda — b ni.

a && b qoidasi: a falsy bo'lsa — a ni qaytaradi. Aks holda — b ni.

Qisqasi:

  • || birinchi truthy qiymatni qidiradi.
  • && birinchi falsy qiymatni qidiradi.

Qaytarilgan qiymat bu yerda boolean'ga aylantirilmaydi. 0 && "Vali" natijasi false emas, aynan 0.

Nega true && false baribir false beradi? Chunki tomonlar allaqachon boolean. Qoida bo'yicha tomonlardan biri qaytadi — u ham boolean bo'ladi.

5.2 Uzun zanjirlar

Bir nechta || yoki && ketma-ket kelsa ham qoida o'sha. Chapdan o'ngga qarab qidiriladi:

js
console.log(null || 0 || "zaxira" || "boshqa"); // zaxira
console.log(null || 0 || undefined); // undefined
console.log(1 && "a" && 0 && "b"); // 0
console.log(1 && "a" && "b"); // b
  • Birinchi qatorda null va 0 falsy. Birinchi truthy — "zaxira".
  • Ikkinchi qatorda truthy umuman yo'q. Bunda oxirgi qiymat qaytadi — undefined.
  • Uchinchi qatorda birinchi falsy — 0.
  • To'rtinchi qatorda falsy yo'q. Oxirgi qiymat — "b".

Bo'sh joylarni to'ldiring: "" || "Mehmon" ning natijasi [:Mehmon], "Malika" && 0 niki esa [:0].

Tekshirib ko'ring: console.log(undefined || "Toshkent") va console.log("Toshkent" && undefined) nima chiqaradi?

Javob

Birinchisi Toshkent: undefined falsy, shuning uchun || o'ng tomonni qaytaradi. Ikkinchisi undefined: "Toshkent" truthy, shuning uchun && o'ng tomonni qaytaradi — u esa undefined.

6. Qisqa tutashuv (short-circuit)

6.1 Javob ma'lum bo'lsa, qolgani bajarilmaydi

false && ... ni ko'ring. O'ng tomonda nima bo'lishidan qat'i nazar, natija baribir false. Xuddi shunday, true || ... doim true.

JavaScript buni biladi va o'ng tomonni umuman hisoblamaydi. Bu qisqa tutashuv (short-circuit evaluation) deb ataladi: natija ma'lum bo'lishi bilan hisoblash to'xtaydi.

O'xshatish: klubdagi qo'riqchi. Avval yoshingizni so'raydi. 18 dan kichik bo'lsangiz, taklifnomangizga qaramaydi ham — javob allaqachon "yo'q".

Buni ko'z bilan ko'rish mumkin. console.log(...) ni operatorning o'ng tomoniga qo'yamiz. U ishlasa — konsolda matn chiqadi, ishlamasa — chiqmaydi:

js
console.log("Boshlandi");
false && console.log("A: && dan keyin");
true && console.log("B: && dan keyin");
true || console.log("C: || dan keyin");
false || console.log("D: || dan keyin");
console.log("Tugadi");

Konsolda:

text
Boshlandi
B: && dan keyin
D: || dan keyin
Tugadi

Bu yerda har bir qator — alohida ifoda. Sintaksis darsida ko'rganingizdek, ifoda o'zi ham kod qatori bo'la oladi.

  • A chiqmadi: false && ... — javob false, o'ng tomonga qaralmadi.
  • B chiqdi: true && ... — javob o'ng tomonga bog'liq, shuning uchun u bajarildi.
  • C chiqmadi: true || ... — javob true, o'ng tomon kerak emas.
  • D chiqdi: false || ... — javob o'ng tomonga bog'liq.

6.2 Hisoblanmagan qism xato ham bermaydi

Qisqa tutashuvning kuchi shundaki, o'tkazib yuborilgan qism umuman ishlamaydi. Unda xato bo'lsa ham:

js
let hisob = 0;

false && hisob++;
console.log(hisob); // 0

true && hisob++;
console.log(hisob); // 1

Birinchi hisob++ bajarilmadi — hisob o'zgarmadi. Ikkinchisi bajarildi.

E'lon qilinmagan nom ham false && dan keyin xato bermaydi:

js
false && nomalumNarsa;
console.log("Xato chiqmadi");

Konsolda:

text
Xato chiqmadi

Lekin true && dan keyin JavaScript o'ng tomonni hisoblashga majbur:

js
true && nomalumNarsa;
text
ReferenceError: nomalumNarsa is not defined

Tarjimasi: "nomalumNarsa aniqlanmagan". Bu xato nomning o'zida — bunday o'zgaruvchi yo'q. Lekin u faqat o'ng tomon haqiqatan hisoblanganda chiqadi.

Tekshirib ko'ring: Quyidagi kod nima chiqaradi?

js
let tanga = 5;
true || tanga++;
console.log(tanga);
Javob

5. true || ... — natija birinchi tomonda ma'lum bo'ldi, shuning uchun tanga++ bajarilmadi.

7. Qisqa tutashuv amalda

7.1 Default qiymat: || bilan zaxira

|| birinchi truthy qiymatni qaytarishidan foydali naqsh kelib chiqadi. Default qiymat — qiymat bo'lmasa ishlatiladigan zaxira qiymat.

Telegram bot foydalanuvchining ismini so'radi. U ismini yozmasa, "Mehmon" deb murojaat qilamiz:

js
const kiritilganIsm = "";
const ism = kiritilganIsm || "Mehmon";

console.log("Salom,", ism); // Salom, Mehmon

kiritilganIsm bo'sh satr — falsy. Shuning uchun || o'ng tomonni, "Mehmon" ni qaytardi. Ism bo'lganda esa ism o'zi qaytadi:

js
const kiritilganIsm = "Malika";
const ism = kiritilganIsm || "Mehmon";

console.log("Salom,", ism); // Salom, Malika

Maslahat: console.log ga vergul bilan bir nechta qiymat bersangiz, u ularni bo'sh joy bilan ajratib chiqaradi. Shuning uchun "Salom," va ism orasida bo'sh joy paydo bo'ldi.

Bir nechta zaxira ham bo'lishi mumkin: ism || taxallus || "Mehmon". Birinchi to'ldirilgani olinadi.

7.2 Default qiymat tuzog'i: 0 va ""

|| hamma falsy qiymatni "yo'q" deb hisoblaydi. Lekin ba'zan 0 yoki "" — haqiqiy, ataylab tanlangan qiymat.

Choyxona ilovasida mijoz choyga necha qoshiq shakar solishni tanlaydi. Tanlamasa — 2 qoshiq. Mijoz ataylab 0 ni tanladi:

js
const tanlanganShakar = 0; // mijoz shakarsiz choy xohlaydi
const shakar = tanlanganShakar || 2;

console.log(shakar); // 2

Mijoz shakarsiz choy so'radi, dastur esa 2 qoshiq soldi! 0 falsy, shuning uchun || uni tashlab, zaxirani oldi.

Bu tuzoqning tayyor yechimi bor — ?? operatori. U faqat null va undefined da zaxiraga o'tadi. Uni undefined va null darsida qisqa ko'rgan edik, keyingi darsda to'liq o'rganamiz.

7.3 Shartli bajarish: && bilan

&& ning o'ng tomoni faqat chap tomon truthy bo'lsa bajariladi. Bundan "shart rost bo'lsa, shu ishni qil" degan qisqa yozuv chiqadi:

js
const onlaynmi = true;
const yangiXabarlar = 0;

onlaynmi && console.log("Foydalanuvchi onlayn");
yangiXabarlar && console.log("Yangi xabar bor");

Konsolda:

text
Foydalanuvchi onlayn

yangiXabarlar — 0, falsy. Shuning uchun ikkinchi xabar chiqmadi.

Bu yozuv real kodda tez-tez uchraydi. Lekin oddiy "agar ... bo'lsa" uchun if ko'rsatmasi ancha tushunarli. Uni tez orada o'rganamiz. Hozircha && ning bu imkoniyatini taniy olsangiz yetarli.

8. Qaysi operator avval ishlaydi?

Bir ifodada bir nechta operator bo'lsa, ular ma'lum tartibda bajariladi:

  1. ! — eng birinchi.
  2. && — keyin.
  3. || — eng oxirida.

Xuddi matematikada ko'paytirish qo'shishdan oldin bajarilgani kabi.

js
console.log(true || false && false); // true
console.log((true || false) && false); // false

Birinchi qatorda avval false && false hisoblandi — false. Keyin true || false — true. Ikkinchi qatorda qavs tartibni o'zgartirdi.

Shubha bo'lsa — qavs qo'ying. Qavs kodni o'qiyotgan odamga ham yordam beradi. Operatorlarning to'liq tartibini operatorlar ustuvorligi darsida ko'ramiz.

9. De Morgan qonunlari

9.1 Inkorni qavs ichiga kiritish

Ba'zan shart oldida ! va qavs turadi: !(a && b). Bunday ifodani o'qish qiyin. Mantiqda uni soddalashtiradigan ikki qoida bor — De Morgan qonunlari. Ularni XIX asrdagi ingliz matematigi Augustus De Morgan ta'riflagan.

Bu ifoda Shunga teng
!(a && b) !a || !b
!(a || b) !a && !b

Qoida: ! ni qavs ichiga kiritganda, har bir qiymat teskarisiga aylanadi, && esa || ga almashadi (va aksincha).

Hayotdan misol: "Bugun yomg'ir ham, qor ham yog'mayapti". Buni ikki xil aytish mumkin:

  • "Yomg'ir yoki qor yog'yapti" degan gap — yolg'on: !(yomgir || qor).
  • Yomg'ir yog'mayapti va qor yog'mayapti: !yomgir && !qor.

Ma'nosi bir xil.

9.2 Kodda tekshiramiz

Do'kon kechasi va dam olish kunlari yopiq. Do'kon ochiqmi?

js
const tunmi = false;
const damOlishmi = true;

console.log(!(tunmi || damOlishmi)); // false
console.log(!tunmi && !damOlishmi); // false

Ikki yozuv bir xil natija berdi. Ikkinchisi uzunroq, lekin "tun emas va dam olish kuni emas" deb to'g'ridan-to'g'ri o'qiladi.

Qaysi biri qulay — vaziyatga bog'liq. Asosiysi: murakkab inkorni ko'rganda uni De Morgan bilan "yoyib", tushunish osonlashadi.

Tekshirib ko'ring: !(ball > 50 && davomat > 80) ni De Morgan qonuni bilan qayta yozing.

Javob

!(ball > 50) || !(davomat > 80), ya'ni ball <= 50 || davomat <= 80. ! ichkariga kirdi, && esa || ga almashdi. ball > 50 ning teskarisi — ball <= 50 (teng holat ham kiradi).

10. Ko'p uchraydigan xatolar

10.1 Oraliqni 60 <= ball <= 100 deb yozish

js
const ball = 150;

console.log(60 <= ball <= 100); // true

150 ball 100 dan katta, lekin natija true! Bu tuzoqni taqqoslash darsida ko'rgan edik. JavaScript chapdan o'ngga bajaradi: avval 60 <= 150 — true. Keyin true <= 100. true songa aylanadi — 1. 1 <= 100 — true.

To'g'risi — && bilan ikki alohida taqqoslash:

js
const ball = 150;

console.log(ball >= 60 && ball <= 100); // false

10.2 Bitta & yoki | yozish

js
console.log(true & true); // 1
console.log(true | false); // 1

Xato chiqmadi, lekin natija true emas, 1. Bitta & va | — butunlay boshqa, bitli operatorlar (bitwise). Ular sonlarning ikkilik ko'rinishi ustida ishlaydi va qisqa tutashuv qilmaydi. Ularni bitwise darsida o'rganamiz. Mantiqiy "va"/"yoki" uchun doim ikkita belgi: &&, ||.

10.3 ! ning qayerga ta'sir qilishini unutish

Biz "yosh 18 dan kichikmi?" demoqchimiz, ya'ni "yosh 18 yoki undan katta emasmi?":

js
const yosh = 10;

console.log(!yosh >= 18); // false
console.log(!(yosh >= 18)); // true

10 yoshli bola 18 dan kichik — javob true bo'lishi kerak edi. Birinchi qatorda esa ! faqat yosh ga ta'sir qildi: !10 — false. Keyin false >= 18 — false. Bu ifoda istalgan yoshda false beradi — u hech narsani tekshirmayapti. To'g'risi — ikkinchi qator: ! butun taqqoslashga qavs orqali qo'llanadi.

10.4 and, or so'zlarini yozish

Boshqa tillarda (masalan, Python) "va" uchun and so'zi ishlatiladi. JavaScript'da bunday so'z yo'q:

js
const pinTogri = true;
const pulBor = false;
const ruxsat = pinTogri and pulBor;
text
SyntaxError: Unexpected identifier 'and'

Tarjimasi: "kutilmagan nom: and". JavaScript and ni o'zgaruvchi nomi deb o'yladi. Ikki nom orasida operator bo'lishi kerak edi. To'g'risi: pinTogri && pulBor.

10.5 || bilan 0 ni yo'qotish

Buni shakarli choy misolida ko'rdik: 0 || 2 — 2. Agar 0 yoki "" haqiqiy qiymat bo'lishi mumkin bo'lsa, || bilan default bermang. ?? operatorini ishlating.

11. Mashqlar

1-mashq (oson): Natijani toping

Ishga tushirmasdan har bir qator natijasini yozing, keyin tekshiring.

js
console.log(true && false);
console.log(false || true);
console.log(!false);
console.log("olma" || "nok");
console.log("" || "nok");
console.log("olma" && "nok");
Yechim
js
console.log(true && false); // false
console.log(false || true); // true
console.log(!false); // true
console.log("olma" || "nok"); // olma
console.log("" || "nok"); // nok
console.log("olma" && "nok"); // nok

Oxirgi uchtasida || birinchi truthy qiymatni qaytaradi, && esa (falsy topilmasa) oxirgisini. Natija — satrning o'zi, true emas.

2-mashq (o'rta): Bot salomlashuvi

Telegram bot foydalanuvchiga ism bilan murojaat qiladi. Ism bo'lmasa — username'dan, u ham bo'lmasa — "do'st" so'zidan foydalanadi.

js
const ism = "";
const username = "jasur_uz";

murojaat o'zgaruvchisini bitta || zanjiri bilan yarating. console.log("Salom,", murojaat) bilan chiqaring. So'ng username ni undefined ga o'zgartirib, yana sinab ko'ring.

Ishora: || birinchi truthy qiymatni qaytaradi, bo'sh satr esa falsy.

Yechim
js
const ism = "";
const username = "jasur_uz";
const murojaat = ism || username || "do'st";

console.log("Salom,", murojaat); // Salom, jasur_uz

username ni undefined qilsangiz:

js
const ism = "";
const username = undefined;
const murojaat = ism || username || "do'st";

console.log("Salom,", murojaat); // Salom, do'st

Zanjirda chapdan o'ngga birinchi to'ldirilgan qiymat olinadi. Hammasi bo'sh bo'lsa — oxirgisi.

3-mashq (qiyin): Metro turniketi

Turniket yo'lovchini o'tkazadi, agar uning kartasi yoki QR-kodi bo'lsa va u bloklanmagan bo'lsa.

js
const kartaBor = false;
const qrBor = true;
const bloklangan = false;
  1. otaOladi o'zgaruvchisini yarating. Qavslarni to'g'ri qo'ying — || && dan keyin bajarilishini unutmang.
  2. otaOlmaydi o'zgaruvchisini yarating — otaOladi ning teskarisi. Lekin !(...) ni tashqarida qoldirmang: De Morgan qonuni bilan ! ni ichkariga kiriting.
  3. Ikkalasini chiqaring. Ular doim bir-biriga teskari bo'lishi kerak.
Yechim
js
const kartaBor = false;
const qrBor = true;
const bloklangan = false;

const otaOladi = (kartaBor || qrBor) && !bloklangan;
const otaOlmaydi = (!kartaBor && !qrBor) || bloklangan;

console.log(otaOladi); // true
console.log(otaOlmaydi); // false

Qanday chiqdi:

  • otaOladi da qavs shart: usiz kartaBor || qrBor && !bloklangan bo'lib, && birinchi bajarilardi.
  • !((kartaBor || qrBor) && !bloklangan) ga De Morgan qo'llaymiz: && → ||, har bir qism teskari. !(kartaBor || qrBor) || !!bloklangan.
  • !(kartaBor || qrBor) ga yana De Morgan: !kartaBor && !qrBor. !!bloklangan esa shunchaki bloklangan.

bloklangan ni true qilib sinab ko'ring: natijalar false va true ga almashadi.

12. Real ishda

  • Sozlamalarda default qiymat. Node.js serverlarida const port = process.env.PORT || 3000; qatori juda ko'p uchraydi: sozlamada port berilmagan bo'lsa, 3000 olinadi. process.env — server sozlamalari, uni Node.js qismida o'rganamiz.
  • React'da shartli ko'rsatish. React (sayt yasash uchun mashhur vosita) kodida yangiXabar && <Belgi /> kabi yozuvni tez-tez ko'rasiz: xabar bo'lsa, belgi chiqadi. Bu aynan qisqa tutashuv. React'ni kursda alohida o'rganamiz.
  • Eski koddagi tekshiruvlar. foydalanuvchi && foydalanuvchi.ism — "foydalanuvchi bor bo'lsa, ismini ol". Keyingi darsdagi ?. operatori buni qisqaroq qiladi.
  • Intervyu. "&& va || nima qaytaradi?", "0 || 5 natijasi nima?" — tez-tez beriladigan savollar. Endi siz javob berasiz: operandlardan birining o'zi, 5.

Xulosa

  • && — ikkala tomon rost bo'lsa rost; || — bittasi rost bo'lsa yetarli; ! — teskarisi.
  • ! doim boolean qaytaradi. && va || esa tomonlardan birining o'zini qaytaradi.
  • || birinchi truthy qiymatni, && birinchi falsy qiymatni qidiradi. Topilmasa — oxirgisi qaytadi.
  • Qisqa tutashuv: javob ma'lum bo'lsa, o'ng tomon umuman bajarilmaydi.
  • a || "zaxira" — default qiymat naqshi, lekin 0 va "" ni ham "yo'q" deb hisoblaydi.
  • Ustuvorlik: !, keyin &&, keyin ||. De Morgan: !(a && b) = !a || !b.

Keyingi dars: ??, ?. va mantiqiy tayinlash — 0 ni yo'qotmaydigan zaxira operatori va "yo'q" qiymatdan xavfsiz o'tishni o'rganamiz.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
JavaScript mantiqiy operatorlar: &&, ||, ! va qisqa tutashuv — IlmHamroh