3-bo‘lim

Operatorlar va shartlar

Arifmetik va taqqoslash operatorlari, == va === farqi, mantiqiy operatorlar, if/else, ternar operator va switch.

🕑 18 daqiqa o‘qish 📄 659 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Arifmetik operatorlar
  2. Qisqartirilgan yozuvlar
  3. == va === farqi
  4. NaN ni tekshirish
  5. Mantiqiy operatorlar
  6. ?? va ?. operatorlari
  7. if, else if, else
  8. Ternar operator
  9. switch
  10. Xulosa

Dastur qaror qabul qila olishi kerak. Shart konstruksiyalari - shu qarorlarning asosi.

Arifmetik operatorlar #

JavaScript
const a = 17;
const b = 5;

console.log("Qo'shish   :", a + b);
console.log("Ayirish    :", a - b);
console.log("Ko'paytirish:", a * b);
console.log("Bo'lish    :", a / b);
console.log("Qoldiq     :", a % b);
console.log("Daraja     :", a ** 2);

// Butun qismini olish
console.log("Butun bo'lish:", Math.floor(a / b));
Natija
Qo'shish   : 22
Ayirish    : 12
Ko'paytirish: 85
Bo'lish    : 3.4
Qoldiq     : 2
Daraja     : 289
Butun bo'lish: 3
Qoldiq operatori juda foydali

% - eng ko'p ishlatiladigan operatorlardan biri:

JavaScript
son % 2 === 0                  // juft sonmi?
indeks % ranglar.length        // aylanma tanlov
soniya % 60                    // daqiqadagi soniya

Manfiy son bilan ehtiyot bo'ling - JavaScript da natija bo'linuvchining ishorasini oladi:

JavaScript
console.log(-7 % 3);           // -1, ba'zi tillarda 2

Har doim musbat qoldiq kerak bo'lsa:

JavaScript
((-7 % 3) + 3) % 3             // 2

Qisqartirilgan yozuvlar #

JavaScript
let hisob = 10;

hisob += 5;   console.log("+= 5 :", hisob);
hisob -= 3;   console.log("-= 3 :", hisob);
hisob *= 2;   console.log("*= 2 :", hisob);
hisob /= 4;   console.log("/= 4 :", hisob);
hisob **= 2;  console.log("**= 2:", hisob);

let sanoq = 5;
console.log("sanoq++ :", sanoq++);   // avval qaytaradi, keyin oshiradi
console.log("hozir   :", sanoq);
console.log("++sanoq :", ++sanoq);   // avval oshiradi, keyin qaytaradi
Natija
+= 5 : 15
-= 3 : 12
*= 2 : 24
/= 4 : 6
**= 2: 36
sanoq++ : 5
hozir   : 6
++sanoq : 7

== va === farqi #

JavaScript
console.log("5 == 5   :", 5 == 5);
console.log('"5" == 5 :', "5" == 5);
console.log('"5" === 5:', "5" === 5);

console.log("null == undefined :", null == undefined);
console.log("null === undefined:", null === undefined);

console.log("0 == false :", 0 == false);
console.log("0 === false:", 0 === false);

console.log('"" == 0    :', "" == 0);
console.log("NaN == NaN :", NaN == NaN);
Natija
5 == 5   : true
"5" == 5 : true
"5" === 5: false
null == undefined : true
null === undefined: false
0 == false : true
0 === false: false
"" == 0    : true
NaN == NaN : false
Ikki xil tenglik == Erkin tenglik Avval turlarni tenglashtiradi, keyin taqqoslaydi Ishlatmang === Qat'iy tenglik Tur ham, qiymat ham bir xil bo'lishi shart Doim shuni ishlating Yagona istisno: qiymat == null null va undefined ni bir yo'la tekshirish uchun
=== bilan hech qanday yashirin o'zgartirish bo'lmaydi
== mantiqan noizchil

Erkin tenglik tranzitiv emas - matematik mantiqni buzadi:

JavaScript
console.log("" == 0);          // true
console.log(0 == "0");         // true
console.log("" == "0");        // false  (!)

Agar A = B va B = C bo'lsa, A = C bo'lishi kerak edi. Bu yerda bunday emas.

Yana bir tuzoq:

JavaScript
console.log([] == false);      // true
console.log([0] == false);     // true
console.log([1] == true);      // true
console.log([2] == true);      // false (!)

Qoida: har doim === va !== ishlating.

Yagona maqbul istisno - null va undefined ni birga tekshirish:

JavaScript
if (qiymat == null) {          // null yoki undefined
    // ...
}

Bu qasddan qilingan qisqartma va tajribali dasturchilar orasida qabul qilingan.

NaN ni tekshirish #

JavaScript
const natija = Number("salom");

console.log("Qiymat        :", natija);
console.log("natija === NaN:", natija === NaN);
console.log("isNaN(natija) :", isNaN(natija));
console.log("Number.isNaN  :", Number.isNaN(natija));

// isNaN xavfli - avval songa aylantiradi
console.log('isNaN("salom")       :', isNaN("salom"));
console.log('Number.isNaN("salom"):', Number.isNaN("salom"));
Natija
Qiymat        : NaN
natija === NaN: false
isNaN(natija) : true
Number.isNaN  : true
isNaN("salom")       : true
Number.isNaN("salom"): false
NaN o'ziga ham teng emas

NaN === NaN false qaytaradi. Bu IEEE 754 standarti talabi - "son emas" qiymatlar bir-biriga teng deb hisoblanmaydi.

Shuning uchun NaN ni oddiy taqqoslash bilan topib bo'lmaydi.

Ikkita tekshiruv funksiyasi bor va ular farqli:

FunksiyaXatti-harakati
isNaN(x)Avval Number(x) qiladi, keyin tekshiradi
Number.isNaN(x)Faqat haqiqiy NaN uchun true

isNaN("salom") true beradi, chunki "salom" songa aylanmaydi. Lekin "salom" - bu satr, NaN emas.

Har doim Number.isNaN ishlating.

Qiziq fakt: NaN !== NaN xossasidan foydalanib uni aniqlash mumkin edi:

JavaScript
function nanmi(x) { return x !== x; }

Mantiqiy operatorlar #

JavaScript
const yosh = 25;
const talaba = true;

console.log("VA  :", yosh > 18 && talaba);
console.log("YOKI:", yosh > 60 || talaba);
console.log("EMAS:", !talaba);

// Qisqa tutashuv - o'ngdagi baholanmaydi
function chaqirildi() {
    console.log("  (funksiya ishga tushdi)");
    return true;
}

console.log("false && ... :");
const birinchi = false && chaqirildi();

console.log("true || ...  :");
const ikkinchi = true || chaqirildi();

console.log("Natijalar:", birinchi, ikkinchi);
Natija
VA  : true
YOKI: true
EMAS: false
false && ... :
true || ...  :
Natijalar: false true
Qisqa tutashuv - amaliy qo'llanishi

&& va || mantiqiy qiymat emas, operandning o'zini qaytaradi. Bu qulay naqshlarni beradi:

JavaScript
// Standart qiymat berish
const nom = kiritilgan || "Mehmon";

// Shartli bajarish
foydalanuvchi && salomlashish(foydalanuvchi);

// Xavfsiz murojaat
const shahar = manzil && manzil.shahar;

Lekin || da tuzoq bor: 0 va "" ham yolg'on hisoblanadi.

JavaScript
const soni = 0;
console.log(soni || 10);       // 10 - lekin biz 0 ni xohlagandik!

Buning uchun ?? (nullish coalescing) yaratilgan - u faqat null va undefined da ishlaydi:

JavaScript
console.log(soni ?? 10);       // 0 - to'g'ri

?? va ?. operatorlari #

JavaScript
const sozlama = { hajm: 0, nom: "", rang: null };

console.log("|| bilan:", sozlama.hajm || 50);
console.log("?? bilan:", sozlama.hajm ?? 50);
console.log("nom ||   :", sozlama.nom || "nomsiz");
console.log("nom ??   :", sozlama.nom ?? "nomsiz");
console.log("rang ??  :", sozlama.rang ?? "qora");

// Ixtiyoriy zanjir
const foydalanuvchi = { ism: "Aziza" };

console.log("Shahar:", foydalanuvchi.manzil?.shahar);
console.log("Standart:", foydalanuvchi.manzil?.shahar ?? "noma'lum");
Natija
|| bilan: 50
?? bilan: 0
nom ||   : nomsiz
nom ??   : 
rang ??  : qora
Shahar: undefined
Standart: noma'lum

if, else if, else #

JavaScript
function bahoAniqlash(ball) {
    if (ball >= 90) {
        return "A'lo";
    } else if (ball >= 70) {
        return "Yaxshi";
    } else if (ball >= 50) {
        return "Qoniqarli";
    } else {
        return "Qoniqarsiz";
    }
}

const ballar = [95, 75, 55, 30];

for (const ball of ballar) {
    console.log(`${ball} ball -> ${bahoAniqlash(ball)}`);
}
Natija
95 ball -> A'lo
75 ball -> Yaxshi
55 ball -> Qoniqarli
30 ball -> Qoniqarsiz
Qavslarni tashlab ketmang

JavaScript bitta buyruq uchun qavssiz if ga ruxsat beradi:

JavaScript
if (shart) qiling();

Bu 2014-yilda Apple ning "goto fail" zaifligiga sabab bo'lgan naqshning qarindoshi - u yerda C kodida takrorlangan qator butun TLS tekshiruvini o'chirib qo'ygan edi.

JavaScript da ham xuddi shunday xato oson:

JavaScript
if (parolTogri)
    kirishRuxsat();
    logYozish();          // BU DOIM ISHLAYDI - if ga tegishli emas!

Chekinish chalg'itadi, lekin logYozish() shartdan tashqarida.

Qoida: har doim { } qo'ying, hatto bitta qator bo'lsa ham.

Ternar operator #

JavaScript
const yosh = 20;

// if/else
let holat;
if (yosh >= 18) {
    holat = "Balog'atga yetgan";
} else {
    holat = "Voyaga yetmagan";
}

// Ternar - bir qatorda
const holat2 = yosh >= 18 ? "Balog'atga yetgan" : "Voyaga yetmagan";

console.log(holat);
console.log(holat2);

// Shablon ichida
const soni = 1;
console.log(`${soni} ta xabar${soni === 1 ? "" : "lar"}`);
Natija
Balog'atga yetgan
Balog'atga yetgan
1 ta xabar
Ternar operatorni ichma-ich yozmang
JavaScript
// O'QIB BO'LMAYDI
const natija = a ? b ? "x" : "y" : c ? "z" : "w";

Ikki darajadan oshsa - if/else ga o'ting yoki obyekt xaritasi ishlating:

JavaScript
const xarita = {
    kichik: "S",
    orta: "M",
    katta: "L"
};

const belgi = xarita[olcham] ?? "?";

Bu ko'p if dan ham, ichma-ich ternardan ham tozaroq.

switch #

JavaScript
function kunNomi(raqam) {
    switch (raqam) {
        case 1:
            return "Dushanba";
        case 2:
            return "Seshanba";
        case 3:
            return "Chorshanba";
        case 6:
        case 7:
            return "Dam olish kuni";
        default:
            return "Noma'lum";
    }
}

for (const k of [1, 3, 6, 7, 9]) {
    console.log(k, "->", kunNomi(k));
}
Natija
1 -> Dushanba
3 -> Chorshanba
6 -> Dam olish kuni
7 -> Dam olish kuni
9 -> Noma'lum
break ni unutmang

switch da break yozilmasa, bajarilish keyingi case ga o'tib ketadi (fall-through):

JavaScript
switch (rang) {
    case "qizil":
        console.log("Qizil");
        // break yo'q!
    case "yashil":
        console.log("Yashil");     // bu ham ishlaydi
        break;
}

rang === "qizil" bo'lsa ikkala qator chiqadi.

Yuqoridagi misolda case 6: dan keyin break yo'qligi ataylab - bu ikki holatni birlashtirish uchun ishlatiladigan to'g'ri naqsh.

Diqqat: switch === bilan taqqoslaydi:

JavaScript
switch ("5") {
    case 5: console.log("son"); break;      // ishlamaydi
    case "5": console.log("satr"); break;   // ishlaydi
}

return ishlatsangiz break kerak emas - funksiya baribir tugaydi.

Amaliy topshiriq
  1. % bilan sonning juft yoki toqligini aniqlang.
  2. Manfiy son uchun musbat qoldiq oluvchi ifoda yozing.
  3. sanoq++ va ++sanoq farqini misolda ko'rsating.
  4. "" == 0, 0 == "0", "" == "0" natijalarini tushuntiring.
  5. Number.isNaN va isNaN farqini sinang.
  6. || va ?? ni 0 qiymati bilan taqqoslang.
  7. ?. bilan mavjud bo'lmagan ichki xossaga murojaat qiling.
  8. Ball bo'yicha baho qaytaruvchi funksiya yozing.
  9. Ternar operator bilan ko'plik qo'shimchasini qo'shing.
  10. switch da break ni olib tashlab, natijani kuzating.

Xulosa #

  • % qoldiq operatori juft/toq, aylanma tanlovda ishlatiladi.
  • JavaScript da manfiy qoldiq bo'linuvchining ishorasini oladi.
  • === ishlating - == mantiqan noizchil va tranzitiv emas.
  • Yagona istisno: qiymat == null ikkalasini birga tekshiradi.
  • NaN o'ziga teng emas; Number.isNaN ishlating.
  • && va || operandning o'zini qaytaradi, mantiqiy qiymat emas.
  • ?? faqat null/undefined da ishlaydi - 0 va "" o'tadi.
  • ?. mavjud bo'lmagan zanjirda xato o'rniga undefined beradi.
  • if da har doim { } qo'ying.
  • Ternar operatorni ichma-ich yozmang - obyekt xaritasi afzal.
  • switch === bilan solishtiradi va break talab qiladi.

Keyingi bo'limda sikllar bilan ishlashni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.