Biz koâplab operatorlarni maktabdan bilamiz. Ular qoâshish +, koâpaytirish *, ayirish - va boshqa shunga oâxshash narsalardir.
Ushbu bobda biz oddiy operatorlardan boshlaymiz, keyin maktab arifmetikasida yoritilmagan JavaScript-ga xos jihatlarga eâtibor qaratamiz.
Atamalar: âunaryâ, âbinaryâ, âoperandâ
Davom etishdan oldin, keling, baâzi umumiy terminologiyani tushunib olaylik.
-
Operand â operatorlar qoâllaniladigan narsa. Masalan,
5 * 2koâpaytirishida ikkita operand bor: chap operand5va oâng operand2. Baâzida odamlar bularni âoperandâ oârniga âargumentâ deb atashadi. -
Operator bitta operandga ega boâlsa, unary deb ataladi. Masalan, unary inkor
-raqamning belgisini oâzgartiradi:let x = 1; x = -x; alert( x ); // -1, unary inkor qo'llanildi -
Operator ikkita operandga ega boâlsa, binary deb ataladi. Xuddi shu minus binary shaklda ham mavjud:
let x = 1, y = 3; alert(y - x); // 2, binary minus qiymatlarni ayiradiRasmiy ravishda, yuqoridagi misollarda bizda bir xil belgini baham koâradigan ikkita turli operator bor: inkor operatori (raqam belgisini oâzgartiradigan unary operator) va ayirish operatori (bir raqamni boshqasidan ayiradigan binary operator).
Matematika
Quyidagi matematik amallar qoâllab-quvvatlanadi:
- Qoâshish
+, - Ayirish
-, - Koâpaytirish
*, - Boâlish
/, - Qoldiq
%, - Daraja
**.
Birinchi toârttasi oddiy, % va ** haqida esa bir necha soâz aytish kerak.
Qoldiq %
Qoldiq operatori %, koârinishiga qaramay, foizlar bilan bogâliq emas.
a % b ning natijasi a ni b ga butun boâlishdan qoldiqdir.
Masalan:
alert(5 % 2); // 1, 5 ni 2 ga bo'lishdan qoldiq
alert(8 % 3); // 2, 8 ni 3 ga bo'lishdan qoldiq
alert(8 % 4); // 0, 8 ni 4 ga bo'lishdan qoldiq
Daraja **
Daraja operatori a ** b a ni b darajasiga koâtaradi.
Maktab matematikasida biz buni ab deb yozamiz.
Masalan:
alert(2 ** 2); // 2² = 4
alert(2 ** 3); // 2³ = 8
alert(2 ** 4); // 2â´ = 16
Matematikadagi kabi, daraja operatori butun boâlmagan sonlar uchun ham aniqlangan.
Masalan, kvadrat ildiz ½ darajaga koâtarishdir:
alert(4 ** (1 / 2)); // 2 (1/2 daraja kvadrat ildiz bilan bir xil)
alert(8 ** (1 / 3)); // 2 (1/3 daraja kub ildiz bilan bir xil)
Binary + bilan string birlashtirish
Keling, maktab arifmetikasidan tashqari JavaScript operatorlarining xususiyatlari bilan tanishaylik.
Odatda, plyus operatori + raqamlarni qoâshadi.
Ammo, agar binary + stringlarga qoâllanilsa, u ularni birlashtiradi (konkatenatsiya):
let s = "my" + "string";
alert(s); // mystring
Eâtibor bering, agar operandlardan biri string boâlsa, ikkinchisi ham stringga aylantiriladi.
Masalan:
alert("1" + 2); // "12"
alert(2 + "1"); // "21"
Koârib turibsizki, birinchi operand string yoki ikkinchisi string boâlishi muhim emas.
Mana murakkabroq misol:
alert(2 + 2 + "1"); // "41", "221" emas
Bu yerda operatorlar ketma-ket ishlaydi. Birinchi + ikkita raqamni qoâshadi, demak 4 ni qaytaradi, keyin keyingi + unga 1 stringini qoâshadi, yaâni 4 + '1' = '41'.
alert("1" + 2 + 2); // "122", "14" emas
Bu yerda birinchi operand string, kompilyator qolgan ikkita operandni ham string sifatida koâradi. 2 '1' ga birlashtiriladi, yaâni '1' + 2 = "12" va "12" + 2 = "122".
Binary + stringlarni bunday qoâllab-quvvatlaydigan yagona operator. Boshqa arifmetik operatorlar faqat raqamlar bilan ishlaydi va har doim operandlarini raqamlarga aylantiradi.
Mana ayirish va boâlish uchun namoyish:
alert(6 - "2"); // 4, '2' ni raqamga aylantiradi
alert("6" / "2"); // 3, ikkala operandni ham raqamlarga aylantiradi
Raqamli oâzgartirish, unary +
Plyus + ikki shaklda mavjud: yuqorida ishlatgan binary shakl va unary shakl.
Unary plyus yoki boshqacha qilib aytganda, bitta qiymatga qoâllaniladigan plyus operatori + raqamlarga hech narsa qilmaydi. Ammo agar operand raqam boâlmasa, unary plyus uni raqamga aylantiradi.
Masalan:
// Raqamlarga ta'sir qilmaydi
let x = 1;
alert( +x ); // 1
let y = -2;
alert( +y ); // -2
// Raqam bo'lmaganlarni aylantiradi
alert( +true ); // 1
alert( +"" ); // 0
Bu aslida Number(...) bilan bir xil ishni qiladi, lekin qisqaroq.
Stringlarni raqamlarga aylantirish ehtiyoji tez-tez paydo boâladi. Masalan, agar biz HTML forma maydonlaridan qiymatlar olayotgan boâlsak, ular odatda stringlar boâladi. Agar biz ularni qoâshmoqchi boâlsak-chi?
Binary plyus ularni string sifatida qoâshadi:
let apples = "2";
let oranges = "3";
alert(apples + oranges); // "23", binary plyus stringlarni birlashtiradi
Agar biz ularni raqam sifatida koârishni istasak, ularni aylantirib, keyin qoâshishimiz kerak:
let apples = "2";
let oranges = "3";
// binary plyusdan oldin ikkala qiymat ham raqamlarga aylantirildi
alert( +apples + +oranges ); // 5
// uzunroq variant
// alert( Number(apples) + Number(oranges) ); // 5
Matematik nuqtai nazardan, plyuslarning koâpligi gâalati tuyulishi mumkin. Ammo dasturchi nuqtai nazaridan, hech narsa alohida emas: unary plyuslar birinchi qoâllaniladi, ular stringlarni raqamlarga aylantiradi, keyin binary plyus ularni qoâshadi.
Nega unary plyuslar binary plyuslardan oldin qoâllaniladi? Koârib chiqamizki, bu ularning yuqori ustunligi tufayli.
Operatorlar ustunligi
Agar ifodada bir nechta operator boâlsa, bajarilish tartibi ularning ustunligi yoki boshqacha qilib aytganda, operatorlarning standart muhimlik tartibi bilan belgilanadi.
Maktabdan hammamiz bilamizki, 1 + 2 * 2 ifodasida koâpaytirish qoâshishdan oldin hisoblanishi kerak. Bu aynan ustunlik masalasi. Koâpaytirish qoâshishga qaraganda yuqori ustunlikka ega deyiladi.
Qavslar har qanday ustunlikni bekor qiladi, shuning uchun agar standart tartib bizni qoniqtirmasa, uni oâzgartirish uchun qavslardan foydalanishimiz mumkin. Masalan, (1 + 2) * 2 deb yozamiz.
JavaScript da koâplab operatorlar mavjud. Har bir operator tegishli ustunlik raqamiga ega. Kattaroq raqamga ega boâlgani birinchi bajariladi. Agar ustunlik bir xil boâlsa, bajarilish tartibi chapdan oângga.
Mana ustunlik jadvalidan koâchirma (buni eslab qolish shart emas, lekin unary operatorlar tegishli binary operatorlardan yuqoriroq ekanligini unutmang):
| Ustunlik | Nomi | Belgi |
|---|---|---|
| ⦠| ⦠| ⦠|
| 14 | unary plyus | + |
| 14 | unary inkor | - |
| 13 | daraja | ** |
| 12 | koâpaytirish | * |
| 12 | boâlish | / |
| 11 | qoâshish | + |
| 11 | ayirish | - |
| ⦠| ⦠| ⦠|
| 2 | tayinlash | = |
| ⦠| ⦠| ⦠|
Koârib turganimizdek, âunary plyusâ 14 ustunlikka ega, bu âqoâshishâ (binary plyus)ning 11 ustunligidan yuqori. Shuning uchun "+apples + +oranges" ifodasida unary plyuslar qoâshishdan oldin ishlaydi.
Tayinlash
Shuni taâkidlash kerakki, tayinlash = ham operator. U ustunlik jadvalida juda past 2 ustunlik bilan roâyxatga olingan.
Shuning uchun biz oâzgaruvchini tayinlaganimizda, masalan x = 2 * 2 + 1, avval hisob-kitoblar bajariladi va keyin = baholanib, natijani x ga saqlaydi.
let x = 2 * 2 + 1;
alert(x); // 5
Tayinlash = qiymat qaytaradi
= ning operator boâlishi, âsehrliâ til konstruktsiyasi emas, qiziq natijaga olib keladi.
JavaScript dagi barcha operatorlar qiymat qaytaradi. Bu + va - uchun aniq, lekin = uchun ham toâgâri.
x = value chaqiruvi value ni x ga yozadi va keyin uni qaytaradi.
Mana tayinlashni murakkabroq ifodaning bir qismi sifatida ishlatuvchi namoyish:
let a = 1;
let b = 2;
let c = 3 - (a = b + 1);
alert( a ); // 3
alert( c ); // 0
Yuqoridagi misolda (a = b + 1) ifodasining natijasi a ga tayinlangan qiymat (3). Keyin u keyingi hisob-kitoblar uchun ishlatiladi.
Kulgili kod, shunday emasmi? Biz uni qanday ishlashini tushunishimiz kerak, chunki baâzida JavaScript kutubxonalarida buni koâramiz.
Garchi, iltimos, bunday kod yozmang. Bunday hiylalar kodni aniqroq yoki oâqilishi mumkin qilmaydi.
Zanjirli tayinlashlar
Yana bir qiziq xususiyat â tayinlashlarni zanjirlash imkoniyati:
let a, b, c;
a = b = c = 2 + 2;
alert( a ); // 4
alert( b ); // 4
alert( c ); // 4
Zanjirli tayinlashlar oângdan chapga baholanadi. Avval eng oângdagi 2 + 2 ifodasi baholanadi va keyin chapdagi oâzgaruvchilarga tayinlanadi: c, b va a. Oxirida barcha oâzgaruvchilar bitta qiymatni baham koâradi.
Yana, oâqilishi uchun bunday kodni bir necha satrga boâlish yaxshidir:
c = 2 + 2;
b = c;
a = c;
Bu oâqish osonroq, ayniqsa kodni tez koâzdan kechirghanda.
Oâzgartirib-tayinlash
Biz tez-tez oâzgaruvchiga operator qoâllab, yangi natijani xuddi shu oâzgaruvchida saqlashimiz kerak.
Masalan:
let n = 2;
n = n + 5;
n = n * 2;
Bu yozuvni += va *= operatorlari yordamida qisqartirish mumkin:
let n = 2;
n += 5; // endi n = 7 (n = n + 5 bilan bir xil)
n *= 2; // endi n = 14 (n = n * 2 bilan bir xil)
alert(n); // 14
Qisqa âoâzgartir-va-tayinlaâ operatorlari barcha arifmetik va bitli operatorlar uchun mavjud: /=, -=, va boshqalar.
Bunday operatorlar oddiy tayinlash bilan bir xil ustunlikka ega, shuning uchun ular boshqa koâplab hisob-kitoblardan keyin ishlaydi:
let n = 2;
n *= 3 + 5; // o'ng qism birinchi baholanadi, n *= 8 bilan bir xil
alert(n); // 16
Oshirish/kamaytirish
Raqamni birga oshirish yoki kamaytirish eng keng tarqalgan raqamli amallardan biri.
Shuning uchun buning uchun maxsus operatorlar mavjud:
-
Oshirish
++oâzgaruvchini 1 ga oshiradi:let counter = 2; counter++; // counter = counter + 1 bilan bir xil ishlaydi, lekin qisqaroq alert(counter); // 3 -
Kamaytirish
--oâzgaruvchini 1 ga kamaytiradi:let counter = 2; counter--; // counter = counter - 1 bilan bir xil ishlaydi, lekin qisqaroq alert(counter); // 1
Oshirish/kamaytirish faqat oâzgaruvchilarga qoâllanilishi mumkin. 5++ kabi qiymatga ishlatishga urinish xatoga olib keladi.
++ va -- operatorlari oâzgaruvchidan oldin yoki keyin qoâyilishi mumkin.
- Operator oâzgaruvchidan keyin kelsa, u "postfiks shakl"da:
counter++. - âPrefiks shaklâ operator oâzgaruvchidan oldin kelganida:
++counter.
Ikkala bayonot ham bir xil ishni qiladi: counter ni 1 ga oshiradi.
Farq bormi? Ha, lekin biz buni faqat ++/-- ning qaytarilgan qiymatini ishlatgandagina koârishimiz mumkin.
Aniqlashtiraman. Bilganimizdek, barcha operatorlar qiymat qaytaradi. Oshirish/kamaytirish ham istisno emas. Prefiks shakl yangi qiymatni qaytaradi, postfiks shakl esa eski qiymatni (oshirish/kamaytirishdan oldingi) qaytaradi.
Farqni koârish uchun mana misol:
let counter = 1;
let a = ++counter; // (*)
alert(a); // 2
(*) satrda prefiks shakl ++counter counter ni oshiradi va yangi qiymatni 2 qaytaradi. Shuning uchun alert 2 ni koârsatadi.
Endi postfiks shaklni ishlataylik:
let counter = 1;
let a = counter++; // (*) ++counter ni counter++ ga o'zgartirdik
alert(a); // 1
(*) satrda postfiks shakl counter++ ham counter ni oshiradi, lekin eski qiymatni (oshirishdan oldingi) qaytaradi. Shuning uchun alert 1 ni koârsatadi.
Xulosa:
-
Agar oshirish/kamaytirish natijasi ishlatilmasa, qaysi shaklni ishlatishda farq yoâq:
let counter = 0; counter++; ++counter; alert(counter); // 2, yuqoridagi satrlar bir xil ishni qildi -
Agar qiymatni oshirishni va operatorning natijasini darhol ishlatishni istasak, prefiks shaklni kerak qilamiz:
let counter = 0; alert(++counter); // 1 -
Agar qiymatni oshirishni, lekin uning oldingi qiymatini ishlatishni istasak, postfiks shaklni kerak qilamiz:
let counter = 0; alert(counter++); // 0
++/-- operatorlari ifodalarda ham ishlatilishi mumkin. Ularning ustunligi koâpgina boshqa arifmetik amallardan yuqori.
Masalan:
let counter = 1;
alert( 2 * ++counter ); // 4
Taqqoslang:
let counter = 1;
alert( 2 * counter++ ); // 2, chunki counter++ "eski" qiymatni qaytaradi
Texnik jihatdan yaxshi boâlsa-da, bunday yozuv odatda kodni kamroq oâqilishi mumkin qiladi. Bir satr bir nechta ishni qiladi â yaxshi emas.
Kodni oâqiyotganda, tez âvertikalâ koâz skaneri counter++ kabi narsani osongina oâtkazib yuborishi mumkin va oâzgaruvchi oshganligini tushunish aniq boâlmaydi.
Biz âbir satr â bir harakatâ uslubini tavsiya etamiz:
let counter = 1;
alert( 2 * counter );
counter++;
Bitli operatorlar
Bitli operatorlar argumentlarni 32-bitli butun sonlar sifatida koâradi va ularning ikkilik koârinishi darajasida ishlaydi.
Bu operatorlar JavaScript-ga xos emas. Ular koâpgina dasturlash tillarida qoâllab-quvvatlanadi.
Operatorlar roâyxati:
- AND (
&) - OR (
|) - XOR (
^) - NOT (
~) - LEFT SHIFT (
<<) - RIGHT SHIFT (
>>) - ZERO-FILL RIGHT SHIFT (
>>>)
Bu operatorlar juda kamdan-kam ishlatiladi, eng past (bitli) darajada raqamlar bilan urishga toâgâri kelganda. Biz bu operatorlarga tez orada muhtoj boâlmaymiz, chunki veb-ishlanmada ular kam qoâllaniladi, lekin kriptografiya kabi baâzi maxsus sohalarda foydali. Ehtiyoj tugâilganda MDN dagi Bitwise Operators bobini oâqishingiz mumkin.
Vergul
Vergul operatori , eng kam uchraydigan va eng gâayrioddiy operatorlardan biri. Baâzida qisqaroq kod yozish uchun ishlatiladi, shuning uchun nima boâlayotganini tushunish uchun uni bilishimiz kerak.
Vergul operatori bizga bir nechta ifodalarni baholashga imkon beradi, ularni vergul , bilan ajratib. Ularning har biri baholanadi, lekin faqat oxirgisining natijasi qaytariladi.
Masalan:
let a = (1 + 2, 3 + 4);
alert( a ); // 7 (3 + 4 ning natijasi)
Bu yerda birinchi ifoda 1 + 2 baholanadi va uning natijasi tashlab yuboriladi. Keyin 3 + 4 baholanadi va natija sifatida qaytariladi.
Eâtibor bering, vergul operatori juda past ustunlikka ega, = dan ham pastroq, shuning uchun yuqoridagi misolda qavslar muhim.
Ularsiz: a = 1 + 2, 3 + 4 avval + ni baholaydi, raqamlarni a = 3, 7 ga qoâshadi, keyin tayinlash operatori = a = 3 ni tayinlaydi va qolgani eâtiborga olinmaydi. Bu (a = 1 + 2), 3 + 4 kabi.
Nega oxirgi ifodadan tashqari hamma narsani tashlaydigan operator kerak?
Baâzida odamlar uni murakkabroq konstruktsiyalarda bir satrga bir nechta harakatni qoâyish uchun ishlatadi.
Masalan:
// bir satrda uchta amal
for (a = 1, b = 3, c = a * b; a < 10; a++) {
...
}
Bunday hiylalar koâplab JavaScript freymvorklarida ishlatiladi. Shuning uchun biz ularni eslatib oâtmoqdamiz. Ammo odatda ular kod oâqilishini yaxshilamaydi, shuning uchun ularni ishlatishdan oldin yaxshilab oâylashimiz kerak.
Izohlar
<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â¦)