Javascript moduli bo'limi. JavaScript-da arifmetik amallar

Arifmetika bilan tanishmisiz? Raqamlarni qanday qo'shish va ayirishni bilasizmi? JavaScript ham qo'shish va ayirish mumkin. JavaScript-da shunday operatorlar mavjud: qo'shish +, ayirish -, bo'lish /, ko'paytirish *, qoldiq% bilan bo'lish.

Var one = 121;
var two = 13;
ogohlantirish (bir + ikkita);
ogohlantirish (bir - ikkita);
ogohlantirish (bir * ikki);
ogohlantirish (bir / ikki);
ogohlantirish (bir% ikki);

Keling, 1-misolni murakkablashtiraylik

Var javob = ((121 - 12) * 103) + 200;
ogohlantirish (javob);

Keling, 2-misolni murakkablashtiraylik

Var PI = 3,14;

ogohlantirish (javob);

Uchinchi misolni murakkablashtiramiz.

Var PI = 3,14;
var javob = ((121 - 12) * 103) + PI;
var answerEnd = (2 * javob * PI) + (-100);
ogohlantirish (answerEnd);

Va hatto buni amalga oshirish mumkin

Var javob = 101 + (- (- 100));
ogohlantirish (javob);

Ammo bu JavaScript-ning yana nima qila olishi bilan solishtirganda bema'nilik. Buning uchun ko'plab xususiyatlarga ega standart Math ob'ekti mavjud (xususiyatlar bu kontekstda operatsiyalardir).

Math.pow (2, 53) / * -> 2 dan 53 quvvatga * /
Math.round (0,6) / * -> 1,0 - eng yaqin butun songa yaxlitlash * /
Math.ceil (0,6) / * -> 1,0 - yaxlitlash * /
Math.floor (0,6) / * -> 0,0 - pastga yaxlitlash * /
Math.abs (-5) / * -> 5 - modul, mutlaq qiymat * /
Math.max (x, y, z) / * -> Eng katta argumentni qaytaradi * /
Math.min (x, y, z) / * -> Eng kichik argumentni qaytaradi * /
Math.random (); / * -> Bu erda chiqish raqami 0 dan katta, lekin 1 dan kichik * /
Math.PI / * -> Pi raqami * /
Math.E / * -> Natural logarifm asosi * /
Math.sqrt (3) / * -> 3 ning kvadrat ildizi * /
Math.pow (3, 1/3) / * -> 3 ning kub ildizi * /
Math.sin (0) / * -> Trigonometriya: Math.cos, Math.atan va boshqalar ham bor * /
Math.log (10) / * -> 10 ning natural logarifmi * /
Math.log (100) / Math.LN10 / * -> Logarifm asosi 10/100 * /
Math.log (512) / Math.LN2 / * -> 512 dan 2 ta asosga logarifm * /
Math.exp (3) / * -> Math.E kubi * /

Math obyektidan qanday foydalanaman?

/ * Birinchi misol * /
var twoInPow = Math.pow (2, 53);
ogohlantirish (twoInPow);
/ * Ikkinchi misol * /
var valueRaund = 0,1312;
var answerRaunt = Math.round (valueRaund);
ogohlantirish (answerRaunt);
/ * Uchinchi misol * /
var valueRaund = 0,1312;
ogohlantirish (Math.round (valueRaund));
/ * To'rtinchi misol: uchta raqamning eng kattasini topish * /
var a = 12, b = 11, c = 10;
ogohlantirish (Math.max (a, b, c));

Agar diapazondan tashqarida bo'lsa, muhim bitlar yo'qolsa yoki nolga bo'linadi, JavaScript xato qilmaydi. Agar natija juda katta bo'lsa va diapazondan tashqariga chiqsa, u holda "abadiylik" maxsus qiymati qaytariladi, bu "Infinity" ga o'xshaydi.

Muhim bitlarni yo'qotish: arifmetik operatsiya natijasi nolga juda yaqin. Agar shunga qaramay, yo'qotish bo'lsa, 0 (nol) qaytariladi.

NaN global o'zgaruvchisi "raqam emas" degan ma'noni anglatadi. Bu o'zgaruvchining bir o'ziga xos xususiyati bor, tenglikni tekshirish operatsiyasi (==) o'zi bilan solishtirganda ham har doim salbiy natija beradi.

/ * Siz bunday yozolmaysiz * /
agar (x == NaN) (...)

X o'zgaruvchining qiymati NaN ekanligini aniqlash uchun quyidagi konstruktsiyadan foydalanish kerak. Bu tekshirish faqat x NaN bo'lganda to'g'ri bo'ladi


Arifmetik operatorlar va kasting

JavaScript quyidagi arifmetik operatorlarni qo'llab-quvvatlaydi:

JavaScript-ning qiziqarli xususiyati o'zgaruvchilar ustida arifmetik amallarni bajarish qobiliyatidir turli xil turlari... Bunday holda, tarjimon mustaqil ravishda tipni o'zgartirishni amalga oshiradi va belgilangan operatsiyani bajaradi. Turlarni saqlash jarayonida quyidagi qoidalar qo'llaniladi:

1. Agar operandlardan biri satr bo'lsa, boshqa barcha operandlar satr shakliga o'tkaziladi.

Var1 = "Tog'a" var2 = "Vanya" natijasi = var1 + "" + var2 // natija = "Vanya amaki" aralash = var2 + 100 // aralash = "Vanya100"

2. Ifodadagi barcha operandlar mantiqiy bo'lmasa, barcha mantiqiy operandlar raqamli shaklga o'tkaziladi. Bu rostni "1" ga va yolg'onni "0" ga aylantiradi. Mantiqiy operandlarni satrlar bilan birlashtirishda barcha operandlar matn shakliga aylantiriladi.

Var1 = haqiqiy var2 = haqiqiy natija = var1 + var2 // natija = 2 aralash = var2 + 100 // aralash = 101 var3 = "string:" str = var3 + var1 // str = "string: true"

3. Agar turlarni quyish muvaffaqiyatsiz bo'lsa, ifodaning natijasi "NaN" bo'ladi (masalan, satrni biror narsaga bo'lishga harakat qilganda).

Var1 = "Tog'a" var2 = "Vanya" natijasi = var1 / var2 // natija = "NaN" aralash = var2 * rost // aralash = "NaN"

Biroq, dastlabki bosqichda, natijalarni o'zgartirish bilan turlar va fokuslardan voz kechish yaxshiroqdir. Bu sizni sezilarli miqdordagi xatolardan saqlaydi.

Matematik ob'ekt

Math ob'ektida asosiy matematik konstantalar va standart matematik funktsiyalar mavjud. Eng ko'p ishlatiladiganlar jadvalda ko'rsatilgan:

Xususiyatlari
LN10 Natural logarifm qiymati 10
LN2 Natural logarifm qiymati 2
PI Pi qiymati
Usullari
abs (raqam) Raqamning mutlaq qiymatini qaytaradi (ya'ni, uning belgisidan qat'iy nazar raqam)
shift (raqam) Raqamni eng yaqin yuqori butun songa yaxlitlaydi (“yuqoriga” yaxlitlash)
Exp (raqam) "e" raqamini quvvat "raqamiga" qaytaradi
qavat (raqam) Raqamni eng yaqin butun songa yaxlitlaydi (pastga yaxlitlash)
maksimal (1-raqam, 2-raqam) Ikki raqamdan kattasini qaytaradi
min (1-raqam, 2-raqam) Ikki sondan kichigini qaytaradi
pow (1-raqam, 2-raqam) “1-raqam”ni “2-raqam” darajasiga qaytaradi
tasodifiy () 0 dan 1 gacha bo'lgan oraliqdagi tasodifiy sonni qaytaradi
dumaloq (raqam) Raqamni standart yaxlitlash qoidalariga muvofiq yaxlitlaydi
sqrt (raqam) Raqamning kvadrat ildizini qaytaradi.

Ro'yxatda keltirilgan barcha funktsiyalardan faqat shift (), pol () va dumaloq () ni yanada aniqroq qilish mantiqan. Keling, misol yordamida ularning farqlarini ko'rib chiqaylik:

Raqam = 1.222 // eng yaqin "pastga" butun son - 1 // eng yaqin "yuqoriga" butun son - 2 // arifmetik tarzda 1 ogohlantirishga yaxlitlash (Math.ceil (num)) ogohlantirish (Math.floor (num)) ogohlantirish (Math. round (num)) // biz uchta xabar olamiz: 2, 1, 1 num = 1.777 // eng yaqin tamsayı "pastga" - 1 // eng yaqin butun "yuqoriga" - 2 // arifmetik ravishda 2 ga yaxlitlash ogohlantirish ( Math.ceil (num) ) ogohlantirish (Math.floor (num)) ogohlantirish (Math.round (son)) // uchta xabar olish: 2, 1, 2

JavaScript-ning matematik funktsiyalar to'plami sizga juda ko'p muammolarni hal qilishga imkon beradi, ammo bundan noto'g'ri foydalanmaslik kerak. Shuni unutmangki, kod tarjimon tomonidan bajariladi, ammo hisob-kitoblarni past darajadagi optimallashtirish haqida gap yo'q, shuning uchun yuqori tezlik erishish juda qiyin bo'ladi.

- (ayirish), + (qo'shish), * (ko'paytirish) va / (bo'linish) operatorlari matematikada arifmetika bilan bir xil ishlaydi. Operator% ( qolgan bo'linish) birinchi operandning ikkinchisiga bo'linishining qolgan qismini qaytaradi. Qolganga bo'lish natijasi birinchi operand bilan bir xil belgiga ega bo'ladi:

Ogohlantirish (10 + 2); // 12 ogohlantirish (10 - 2); // 8 ogohlantirish (10 * 2); // 20 ogohlantirish (10/2); // 5 ogohlantirish (5% 2); // 1 ta ogohlantirish (-5% 2); // -1

Operator ** ( eksponentatsiya) ikkita operandga ega. Birinchi operand quvvatning asosi, ikkinchi operand ko'rsatkichdir, natijada operator belgilangan quvvatga ko'tarilgan bazani qaytaradi:

2 ** 4; // 16

Barcha matematik operatorlar operandlarni Number () funksiyasi bilan bir xil qoidalarga muvofiq aylantiradilar.

Birlik + (ortiqcha) va - (minus)

+ (unar plyus) operatori o'z operandining qiymatini raqamga aylantiradi va aylantirilgan qiymatni qaytaradi. Raqamli operand bilan foydalanilganda, u hech narsa qilmaydi:

Var x = + "5";

- (unar minus) operatori, agar kerak bo'lsa, o'z operandining qiymatini raqamga o'zgartiradi va keyin raqamni salbiy qiladi:

Var x = -5 + 3;

Unary plyus va minus operandlarni Number () funktsiyasi bilan bir xil qoidalarga muvofiq o'zgartiradi.

O'sish va kamaytirish

++ (o'sish) operatori o'z operandining qiymatini bittaga oshiradi. Agar operandning qiymati raqam bo'lmasa, operator uni avtomatik ravishda raqamga aylantiradi, uni bittaga oshiradi va natijani qaytaradi, bu esa operandga qayta tayinlanadi.

O'sish ikki shaklga ega - postfiks (operator operanddan keyin qo'yiladi) va prefiks (operator operanddan oldin joylashtiriladi). Agar u postfiks shaklida ishlatilsa, u holda operandning dastlabki qiymati qaytariladi va shundan keyingina operandning qiymati bittaga oshiriladi.

Ko'pincha JavaScript hisob-kitoblari biz xohlagan natijalarni bermaydi. Albatta, biz raqamlar bilan hamma narsani qila olamiz - yuqoriga yoki pastga yaxlitlash, diapazonlarni o'rnatish, keraksiz raqamlarni ma'lum miqdordagi o'nli kasrlarga kesib tashlash, barchasi kelajakda bu raqam bilan nima qilishni xohlashingizga bog'liq.

Nega yaxlitlash kerak?

JavaScript-ning qiziq jihatlaridan biri shundaki, u aslida butun sonlarni saqlamaydi, biz darhol suzuvchi nuqtali raqamlar bilan ishlaymiz. Bu, ko'plab kasr qiymatlarini o'nli kasrlarning cheklangan sonida ifodalash mumkin emasligi bilan birgalikda, JavaScript-da biz quyidagi natijalarni olishimiz mumkin:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
Amaliy maqsadlar uchun bu noaniqlik umuman muhim emas, bizning holatlarimizda biz kvintilion qismlardagi xato haqida gapiramiz, ammo bu kimnidir hafsalasi pir bo'lishi mumkin. Valyutalar, foizlar yoki fayl o'lchamlari qiymatlarini ifodalovchi raqamlar bilan ishlashda biz biroz g'alati natijaga erishishimiz mumkin. Ushbu noaniqliklarni tuzatish uchun biz natijalarni yaxlitlash imkoniyatiga ega bo'lishimiz kerak, buning uchun o'nlik aniqlikni o'rnatish kifoya.

Raqamlarni yaxlitlash amaliy qo'llanilishiga ega, biz ma'lum bir diapazondagi raqamni boshqarishimiz mumkin, masalan, biz qiymatni faqat o'nli qism bilan ishlamasdan, eng yaqin butun songa yaxlitlashni xohlaymiz.

O'nli sonlarni yaxlitlash

Kasr sonini olib tashlash uchun toFixed yoki toPrecision usulidan foydalaning. Ularning ikkalasi ham bitta argumentni qabul qiladi, natijada natijada mos ravishda nechta muhim raqam (ya'ni, raqamda ishlatiladigan raqamlarning umumiy soni) yoki o'nli kasrlar (o'nlik nuqtadan keyingi raqam) aniqlanishi kerak:
  1. Agar argument toFixed () uchun aniqlanmagan bo'lsa, u holda sukut bo'yicha u nolga teng bo'ladi, bu 0 kasrni bildiradi, argumentda maksimal qiymat 20 ga teng.
  2. Agar toPrecision uchun argument berilmasa, raqam tegmasdan qoladi
randNum = 6,25 bo'lsin; randNum.toFixed (); > "6" Math.PI.toPrecision (1); > "3" randNum = 87,335; randNum.toFixed (2); > "87,33" randNum = 87,337; randNum.toPrecision (3); > "87,3"
ToFixed () va toPrecision () ikkalasi ham raqamni emas, natijaning satr tasvirini qaytaradi. Bu shuni anglatadiki, yaxlitlangan qiymat randNum bilan yig'ilsa, raqamlar yig'indisi emas, balki satrlar birlashtiriladi:

RandNum = 6,25 bo'lsin; Let rounded = randNum.toFixed (); // "6" console.log (randNum + yaxlitlangan); > "6.256"
Agar natija raqamli ma'lumotlar turiga ega bo'lishini istasangiz, parseFloat-dan foydalanishingiz kerak bo'ladi:

RandNum = 6,25 bo'lsin; let rounded = parseFloat (randNum.toFixed (1)); console.log (yumaloqlangan); > 6.3
E'tibor bering, kamdan-kam hollarda 5 ta qiymat yaxlitlanadi.

ToFixed () va toPrecision () usullari foydalidir, chunki ular nafaqat kasr qismini ajratibgina qolmay, balki o'nli kasrlarni ham to'ldirishlari mumkin, bu valyuta bilan ishlashda qulaydir:

ButunNum = 1 bo'lsin dollarsCents = butunNum.toFixed (2); console.log (dollarSents); > "1.00"
E'tibor bering, agar butun sonlar aniqlikning o'zidan katta bo'lsa, toPrecision natijani eksponensial belgida beradi:

Num = 123,435 num.toPrecision (2); > "1.2e + 2"

O'nli sonlar bilan yaxlitlash xatolaridan qanday qochish kerak

Ba'zi hollarda toFixed va toPrecision 5 ni pastga va yuqoriga aylantiradi:

numTest = 1.005; numTest.toFixed (2); > "1.00"
Yuqoridagi hisoblash natijasi 1 emas, 1,01 bo'lishi kerak edi. Agar siz ushbu xatolikdan qochishni istasangiz, hisoblash uchun eksponensial raqamlardan foydalanadigan Jek L Mur taklif qilgan yechimdan foydalanishimiz mumkin:

Funktsiya davrasi (qiymat, o'nlik) (qaytish Raqam (Math.round (qiymat + "e" + o'nli kasrlar) + "e -" + o'nli kasrlar);)
Hozir:

Tur (1.005.2); > 1.01
Agar siz yuqorida ko'rsatilganidan ko'ra ishonchliroq yechimni istasangiz, MDN ga o'tishingiz mumkin.

Epsilonni yaxlitlash mashinasi

O'nli sonlarni yaxlitlashning muqobil usuli ES6 da joriy qilingan. Mashina epsilonini yaxlitlash ikkita suzuvchi nuqta raqamlarini taqqoslashda o'rtacha xato chegarasini ta'minlaydi. Yaxlitlashsiz, taqqoslashlar quyidagiga o'xshash natijalarni berishi mumkin:

0,1 + 0,2 === 0,3> noto'g'ri
To'g'ri taqqoslashni olish uchun funksiyamizda Math.EPSILON dan foydalanamiz:

epsEqu funktsiyasi (x, y) (Math.abs (x - y) ni qaytaring)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
Funktsiya ikkita argumentni oladi: birinchisi joriy hisob, ikkinchisi kutilgan natija. U ikkalasini taqqoslashni qaytaradi:

EpsEqu (0,1 + 0,2, 0,3)> rost
Barcha zamonaviy brauzerlar allaqachon ES6 matematik funktsiyalarini qo'llab-quvvatlaydi, ammo IE 11 kabi brauzerlarda qo'llab-quvvatlashni istasangiz, polifilllardan foydalaning.

Fraksiyonel kesish

Yuqorida keltirilgan barcha usullar o'nlik sonlarga yaxlitlashni biladi. Raqamni ikkita kasrga kesib tashlash uchun avval uni 100 ga ko'paytirishingiz kerak, so'ngra natijani 100 ga bo'lishingiz kerak:

Funktsiya kesilgan (son) (qaytish Math.trunc (num * 100) / 100;) kesilgan (3.1416)> 3.14
Agar siz usulni har qanday o'nli kasrga moslashtirmoqchi bo'lsangiz, ikki bitli inkordan foydalanishingiz mumkin:

Funktsiya qisqartirildi (num, decimalPlaces) (numPowerConverter = Math.pow (10, decimalPlaces); qaytish ~~ (num * numPowerConverter) / numPowerConverter;)
Hozir:

RandInt = 35,874993 bo'lsin; kesilgan (randInt, 3); > 35.874

Eng yaqin raqamga yaxlitlash

O'nlik sonni yuqoriga yoki pastga yaxlitlash uchun, qaysi biri yaqinroq bo'lsa, Math.round () dan foydalaning:

Math.round (4.3)> 4 Math.round (4.5)> 5
E'tibor bering, "yarmi qiymat" 0,5 matematika qoidalariga muvofiq yaxlitlanadi.

Pastga eng yaqin butun songa yaxlitlang

Agar siz har doim pastga aylantirmoqchi bo'lsangiz, Math.floor dan foydalaning:

Math.floor (42.23); > 42 Math.floor (36,93); > 36
E'tibor bering, yaxlitlash barcha raqamlar, shu jumladan salbiy raqamlar uchun ham ishlaydi. Cheksiz ko'p qavatli osmono'par binoni tasavvur qiling, shu jumladan pastki qavatdagilar (salbiy raqamlarni ifodalaydi). Agar siz liftda 2 dan 3 gacha bo'lgan pastki qavatda bo'lsangiz (bu qiymat -2,5 ni bildiradi), Math.floor sizni -3 ga tushiradi:

Math.floor (-2,5); > -3
Ammo, agar siz bunday vaziyatdan qochishni istasangiz, barcha zamonaviy brauzerlarda (IE / Edgedan tashqari) qo'llab-quvvatlanadigan Math.trunc dan foydalaning:

Math.trunc (-41,43); > -41
MDN-da siz brauzerlarda va IE/Edge-da Math.trunc-ni qo'llab-quvvatlaydigan polifillni topasiz.

Eng yaqin butun songa yaxlitlang

Boshqa tomondan, agar siz doimo yaxlitlashingiz kerak bo'lsa, Math.ceil dan foydalaning. Yana cheksiz ko'tarilishni eslab: Raqam manfiy yoki yo'qligidan qat'i nazar, Math.ceil har doim yuqoriga ko'tariladi:

Math.ceil (42,23); > 43 Math.ceil (36,93); > 37 Math.ceil (-36,93); > -36

Zarur bo'lganda yuqoriga/pastga yaxlitlash

Agar biz 5 ning eng yaqin karraligacha yaxlitlashni istasak, eng oddiy usul bu raqamni 5 ga bo'ladigan, yaxlitlovchi va keyin uni bir xil miqdorga ko'paytiruvchi funktsiyani yaratishdir:

roundTo5 funktsiyasi (son) (Math.round (son / 5) * 5; qaytaring)
Hozir:

RoundTo5 (11); > 10
Agar siz qiymatingizni ko'paytmalarga yaxlitlashni xohlasangiz, biz boshlang'ich qiymatni va ko'paytmani o'tkazadigan umumiyroq funktsiyadan foydalanamiz:

roundToMultiple funktsiyasi (son, ko'p) (Math.round (son / ko'p) * ko'p; qaytaring)
Hozir:

Boshlang'ich raqam = 11 bo'lsin; ko'p = 10; roundToMultiple (dastlabki raqam, bir nechta); > 10;

Raqamni diapazonda aniqlash

Biz x ni diapazonda olishni istagan ko'p holatlar mavjud. Misol uchun, biz 1 dan 100 gacha qiymatni xohlashimiz mumkin, lekin biz 123 qiymatini oldik. Buni tuzatish uchun min (raqamlar to‘plamining eng kichigini qaytaradi) va max (har qanday raqamlar to‘plamining eng kattasini qaytaradi) dan foydalanishimiz mumkin. ). Bizning misolimizda diapazon 1 dan 100 gacha:

LowBound = 1 bo'lsin; highBound = 100 bo'lsin; numInput = 123 bo'lsin; let clamped = Math.max (lowBound, Math.min (numInput, highBound)); console.log (qisqichli); > 100;
Shunga qaramay, biz operatsiyani qayta ishlatishimiz va hamma narsani funktsiyaga o'rashimiz mumkin, keling, Daniel X. Mur tomonidan taklif qilingan yechimdan foydalanamiz:

Number.prototype.clamp = funktsiya (min, max) (Math.min qaytaring (Math.max (bu, min), max);
Hozir:

NumInput.clamp (lowBound, highBound); > 100;

Gauss yaxlitlash

Gauss yaxlitlash, shuningdek, bank yaxlitlash deb ham ataladi, yaxlitlash eng yaqin masofada sodir bo'ladi. Ushbu yaxlitlash usuli statistik xatoliksiz ishlaydi. Eng yaxshi yechim Tim Daun tomonidan taklif qilingan:

Funktsiya gaussRound (son, decimalPlaces) (bo'lsin d = decimalPlaces || 0, m = Math.pow (10, d), n = + (d? Son * m: num) .toFixed (8), i = Math.floor (n), f = n - i, e = 1e-8, r = (f> 0,5 - e && f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
Hozir:

GaussRound (2.5)> 2 gaussRound (3.5)> 4 gaussRound (2.57,1)> 2.6
CSS-da o'nlik nuqta:

JavaScript ko'pincha HTML elementlarining pozitsion o'zgarishlarini yaratish uchun ishlatilganligi sababli, elementlarimiz uchun o'nlik qiymatlarni yaratsak nima bo'ladi, degan savol tug'ilishi mumkin:

#box (kengligi: 63.667731993px;)
Yaxshi xabar shundaki, zamonaviy brauzerlar quti modelidagi o'nlik qiymatlarni, shu jumladan foiz yoki piksel birliklarini hisobga oladi.

Tartiblash

Ko'pincha biz ba'zi elementlarni saralashimiz kerak, masalan, bizda bir qator o'yin yozuvlari mavjud va ular o'yinchilarning darajasining kamayishiga qarab tartibga solinishi kerak. Afsuski, standart sort () usuli hayratlanarli cheklovlarga ega: u tez-tez ishlatiladigan inglizcha so'zlar bilan yaxshi ishlaydi, lekin raqamlar, noyob belgilar yoki katta harflar bilan duch kelganda darhol buziladi.

Alifbo tartibida tartiblang

Massivni alifbo tartibida saralash eng oddiy vazifa bo'lishi kerakdek tuyuladi:

Meva = ["butternut squash", "o'rik", "qovun"] bo'lsin; meva.sort (); > "o'rik", "yog'li qovoq", "qovun"]
Biroq, elementlardan biri katta harf bo'lishi bilanoq muammoga duch kelamiz:

Meva = ["butternut squash", "o'rik", "Cantalope"] bo'lsin; meva.sort (); > "Qovun", "o'rik", "yog'li qovoq"]
Buning sababi shundaki, sukut bo'yicha tartiblovchi Unicode-da ko'rsatilgan birinchi belgini taqqoslaydi. Unicode - platformadan qat'i nazar, dasturdan qat'i nazar, tildan qat'i nazar, har qanday belgi uchun noyob kod. Misol uchun, agar siz kodlar jadvaliga qarasangiz, "a" belgisi U + 0061 qiymatiga ega (0x61 o'n oltilik tizimida), "C" belgisi esa U + 0043 (0x43) kodiga ega bo'lib, u avvalroq keladi. Unicode jadvali "A" belgisidan ko'ra.

Birinchi harflar aralash bo'lishi mumkin bo'lgan massivni saralash uchun biz barcha elementlarni vaqtincha kichik harfga aylantirishimiz yoki ba'zi argumentlar bilan localeCompare () usuli yordamida o'z tartibimizni belgilashimiz kerak. Qoida tariqasida, bunday holatda takroriy foydalanish uchun darhol funktsiyani yaratish yaxshiroqdir:

Funktsiya alphaSort (arr) (arr.sort (funktsiya (a, b) (qaytish a.localeCompare (b, "en", ("sezuvchanlik": "baza"));));) meva = ["butternut squash" qilaylik "," o'rik "," Cantalupe "]; alphaSort (meva)>
Agar siz massivni alifbo tartibida teskari tartibda tartiblashni istasangiz, funksiyadagi a va b pozitsiyalarini almashtiring:

Funktsiya alphaSort (arr) (arr.sort (funktsiya (a, b) (qaytish b.localeCompare (a, "en", ("sezuvchanlik": "baza"));));) meva = ["butternut squash" qilaylik "," o'rik "," Qovoq "]; alphaSort (meva)> ["Qantalupa", "yog'li qovoq", "o'rik"]
Shuni ta'kidlash kerakki, localeCompare argumentlar bilan ishlatiladi, shuningdek, IE11 + tomonidan qo'llab-quvvatlanishini yodda tutish kerak, IE ning eski versiyalari uchun biz uni argumentlarsiz va kichik harflarda ishlatishimiz mumkin:

Funktsiya caseSort (arr) (arr.sort (funktsiya (a, b) (a.toLowerCase (). LocaleCompare (b.toLowerCase ());));) meva = ["butternut squash", "o'rik", "Mushkli qovun"]; caseSort (meva)> ["o'rik", "yog'li qovoq", "Qovun"]

Raqamli tartiblash

Bularning barchasi biz yuqorida aytib o'tgan o'yin rekordlari to'g'risidagi misolga taalluqli emas. Ba'zi sonli massivlarda saralash juda yaxshi ishlaydi, lekin bir nuqtada natija oldindan aytib bo'lmaydigan bo'lishi mumkin:

HighScores =; highScores.sort (); >
Gap shundaki, sort () usuli leksikografik taqqoslashni amalga oshiradi: bu raqamlar satrga aylantiriladi va taqqoslashlar Unicode jadvali belgilari tartibida ushbu satrning birinchi belgisini moslashtirish orqali yana amalga oshiriladi. Shuning uchun biz yana tartiblash tartibini aniqlashimiz kerak:

HighScores =; highScores.sort (funktsiya (a, b) (qaytish a - b;)); >
Shunga qaramay, raqamlarni teskari tartibda saralash uchun funktsiyadagi a va b o'rinlarini almashtiring.

JSONga o'xshash tuzilmani saralash

Va nihoyat, agar bizda JSONga o'xshash ma'lumotlar tuzilmasi bo'lsa, u o'yin yozuvlari qatori sifatida taqdim etiladi:

Ballar bo'lsin = [("ism": "Daniel", "ball": 21768), ("ism": "Maykl", "ball": 33579), ("ism": "Alison", "ball": 38395 )];
ES6+ da siz strelka funksiyalaridan foydalanishingiz mumkin:

Scores.sort ((a, b) => b.score - a.score));
Ushbu yordamga ega bo'lmagan eski brauzerlar uchun:

Scores.sort (funktsiya (a, b) (qaytish a.score - b.score));
Ko'rib turganingizdek, JavaScript-da tartiblash aniq narsa emas, umid qilamanki, bu misollar hayotni qandaydir tarzda osonlashtiradi.

Quvvat funksiyalari bilan ishlash

Ko'rsatkich - bu dastlab natural sonni o'z-o'zidan bir necha marta ko'paytirish natijasida aniqlangan amal bo'lib, a ning kvadrat ildizi kvadrati bo'lganda a ni beradigan sondir. Biz ushbu funktsiyalardan doimiy ravishda foydalanishimiz mumkin Kundalik hayot matematika darslarida, jumladan, maydonlarni, hajmlarni hisoblashda yoki hatto jismoniy modellashtirishda.

JavaScript-da eksponentsial funktsiya Math.pow () ko'rinishida taqdim etilgan bo'lsa, yangi ES7 standartida yangi daraja ko'rsatish operatori joriy qilingan - "* *".

Eksponentsiya

Raqamni n-darajali darajaga ko'tarish uchun Math.pow () funksiyasidan foydalaning, bunda birinchi argument darajaga ko'tariladigan son, ikkinchi argument esa ko'rsatkichdir:

Math.pow (3,2)> 9
Belgilanishning bu shakli 3 kvadrat yoki 3 × 3 degan ma'noni anglatadi, natijada 9 ga olib keladi. Yana bir misol keltirishingiz mumkin, albatta:

Math.pow (5.3); > 125
Ya'ni, 5 kub yoki 5 × 5 × 5 125 ga teng.

ECMAScript 7 JavaScript-ning navbatdagi versiyasi bo'lib, printsipial jihatdan biz yangi taklif qilingan eksponentsiya operatoridan foydalanishimiz mumkin - * *, bu belgi shakli yanada tavsiflovchi bo'lishi mumkin:

3 ** 2 > 9
Yoniq bu daqiqa ushbu operatorni qo'llab-quvvatlash juda cheklangan, shuning uchun uni ishlatish tavsiya etilmaydi.

Quvvat funktsiyasi eng ko'p yordam berishi mumkin turli vaziyatlar... Oddiy misol, bir soat ichida soniyalar sonini hisoblash: Math.pow (60,2).

Kvadrat va kub ildiz

Math.sqrt () va Math.cbrt () Math.pow () funksiyasiga qarama-qarshidir. Esda tutingki, a ning kvadrat ildizi kvadrat bo'lganda a ni beradigan sondir.

Math.sqrt (9)> 3
Shu bilan birga, a sonining kub ildizi kubga ko'tarilganda a ni beradigan sondir.

Math.cbrt (125)> 5
Math.cbrt () JavaScript spetsifikatsiyasiga yaqinda kiritilgan va shuning uchun faqat zamonaviy brauzerlarda qo'llab-quvvatlanadi: Chrome 38+, Firefox va Opera 25+ va Safari 7.1+. Siz buni sezasiz Internet Explorer bu ro'yxatda yo'q, lekin siz MDN da polifillni topasiz.

ga misollar

Albatta, biz ushbu funktsiyalardan birida butun son bo'lmagan qiymatlardan ham foydalanishimiz mumkin:

Math.pow (1.25, 2); > 1.5625 Math.cbrt (56.57)> 3.8387991760286138
E'tibor bering, bu salbiy argument qiymatlari uchun ham yaxshi ishlaydi:

Math.pow (-5,2)> 25 Math.pow (10, -2)> 0,01
Biroq, kvadrat ildiz uchun bu ishlamaydi:

Math.sqrt (-9)> NaN
Matematik tahlildan bilamizki, xayoliy son deganda manfiy sonlarning kvadrat ildizlari tushuniladi. Va bu bizni murakkab raqamlar bilan ishlashning boshqa texnikasiga olib kelishi mumkin, ammo bu boshqa hikoya.

Raqamlarning kvadrat va kub ildizlarini topish uchun Math.pow () da kasr qiymatlaridan foydalanishingiz mumkin. Kvadrat ildiz 0,5 ko'rsatkichidan foydalanadi:

Math.pow (5, 0,5); // = Math.sqrt (5) = 5 ** (1/2)> 2,23606797749979
Biroq, suzuvchi nuqtaning injiqliklari tufayli siz to'g'ri natijani aniq taxmin qila olmaysiz:

Math.pow (2.23606797749979.2)> 5.000000000000001
Bunday holatlarda siz belgilarni raqamdan yoki yaxlitlashdan biron bir qiymatga qisqartirishga murojaat qilishingiz kerak bo'ladi.

Ba'zilar JavaScript-da noma'lum sabablarga ko'ra Math.pow () funksiyasini umuman raqamlar uchun eksponensial funksiya bo'lgan Math.exp () bilan aralashtirib yuborishadi. Eslatma: in ingliz tili"Exponent" "eksponent" deb tarjima qilinadi, shuning uchun u ko'proq ingliz tilida so'zlashuvchilarga murojaat qiladi, garchi ko'rsatkich uchun indeks, quvvat kabi muqobil nomlar mavjud.

Matematik konstantalar

JavaScript-da matematika bilan ishlash bir qator o'rnatilgan konstantalar tufayli osonlashadi. Bu konstantalar Math obyektining xossalaridir. Shuni ta'kidlash kerakki, doimiylar CamelCase notatsiyasida emas, balki katta harflarda yoziladi.

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. , Iltimos.

Teglar: teglar qo'shish

Sizga shuni eslataman yangi boshlanuvchilar uchun JavaScript-ga kirish... Bugun biz qaysi birini ko'rib chiqamiz operatorlar mavjud JavaScript-da... Xavfsizlik kamarlarini taqib oling! Bukaf juda ko'p bo'ladi.

Agar sizda juda ko'p ma'lumotlar bo'lsa, u bilan biror narsa qilishingiz kerak. Operatorlar biznes bilan band. Ular har doim qo'shish, ko'paytirish, bo'lish, ayirish, solishtirish, o'zlashtirib olish va boshqa shaytonlardir. Dasturlashda operatorlarsiz bo'tqa pishirib bo'lmaydi.

JavaScript-da quyidagi turdagi operatorlar qo'llaniladi:

  • Arifmetik operatorlar
  • Belgilash operatorlari
  • Taqqoslash operatorlari
  • Mantiqiy operatorlar
  • String operatorlari
  • Shartli operatorlar

Bu uzoq to'liq ro'yxat, lekin birinchi navbatda, bu ko'zlar uchun etarli. Keling, taqdim etilgan operatorlarning har bir turini tahlil qilaylik, ular nima uchun kerak va ular nima bilan iste'mol qilinadi. Bor!

JavaScript-dagi arifmetik operatorlar

Barchangiz arifmetik operatorlar bilan o'rta maktabdan beri tanishsiz. Bu qo'shish, ayirish, bo'lish va ko'paytirish uchun odatiy belgilar: +, -, /, *. Shunga ko'ra, ular dasturlashda oddiy matematikadagi kabi funktsiyalarni bajaradilar. Bu bilan hech qanday qiyinchiliklarga duch kelmaysiz.

Operatorlar ishlaydigan ma'lumotlar deyiladi operandlar.

2 + 3 // bu erda 2 va 3 raqamlari operandlar, + belgisi esa qo'shish operatoridir

Matematikaga o'xshab, arifmetik operatorlar ham o'z ustuvorliklariga ega: ko'paytirish va bo'lish qo'shish va ayirishdan ustun turadi.

2 + 3 * 4 // bu erda birinchi navbatda ko'paytirish, keyin esa qo'shish amalga oshiriladi

Va xuddi matematikada bo'lgani kabi, ustunlikni o'zgartirish uchun qavslar ko'p ishlatiladi:

(2 + 3) * 4 // bu erda birinchi navbatda qo'shish, keyin esa ko'paytirish amalga oshiriladi

Aytgancha, = belgisi ham operator hisoblanadi. Biz allaqachon maqolada bilib olganimizdek, bu tayinlash operatori va umuman teng belgi emas. Buni unutmang!

Modul operatori

Endi yana bir nechta qiziqarli arifmetik operatorlarni ko'rib chiqamiz. Va birinchisi foiz belgisi -% bo'ladi. JavaScript-da bular umuman so'zning foizlari emas. Dasturlashda modullarga bo'linish shunday qo'llaniladi. Bunday operatsiyaning natijasi bo'linishning qolgan qismi bo'ladi. Masalan:

100% 22 // qolgan 12 bo'ladi
100% 10 // qolgan 0 bo'ladi

Hisob-kitoblar uchun ushbu operator ko'paytirish va bo'lish bilan bir xil ustunlikka ega, shuning uchun qavslarni kiritishni unutmang.

Operatorlarni birlashtirish

Belgini qisqartirish uchun = operatori boshqa operatorlar bilan birlashtirilishi mumkin va kerak. Misol:

var n = 2; // n o'zgaruvchisini 2 ga qo'ying
n = n + 3; // n o'zgaruvchisiga n + 2 yangi qiymat bering, biz 5 ni olamiz

Xuddi shunday yozilishi mumkin:

var n = 2;
n + = 3; // n = n + 3 yozishga teng

O'sish ++ va kamaytirish operatorlari - -

Arifmetik operatorlar orasida bir nechta juda qiziq bo'lganlar bor - oshirish va kamaytirish... ++ va –– mos ravishda ko'rsatilgan. Birinchisi o'zgaruvchini bittaga oshiradi, ikkinchisi esa uni kamaytiradi. Bu xususiyat dasturlashda juda tez-tez qo'llaniladi, chunki u juda ko'p qulayliklar beradi. Ko'pincha uni shartli iboralarda topish mumkin, ammo bu haqda keyinroq.

Ikkala operator ham yozuvda ma'lum bir joyga ega. Ular ikkalasida ham bo'lishi mumkin prefiks shakl (o'zgaruvchidan oldin) ++ n va in postfiks(o'zgaruvchidan keyin) n ++. Farqi juda katta! Hech qachon bu shakllarni aralashtirib yubormang va ularni yaxshi eslab qoling. Agar bu operatorlar o'zgaruvchidan oldin kelsa, natijada uning qiymati 1 ga oshadi. Lekin! Agar ular o'zgaruvchidan keyin kelsa, ular asl qiymatni qaytaradilar. Misol:

var n = 2, m = 0;
m = ++ n // n ni 1 ga oshiradi (n = 3) va m ga bir xil 3 qiymatini beradi

var n = 2, m = 3;
m = n ++ // n ni 1 ga oshiradi (n = 3), lekin m ni oldingi n = 2 qiymatiga belgilaydi

Birinchi misol bilan, ishonchim komilki, siz buni osongina tushunasiz. Ammo ikkinchisi bilan muammolar paydo bo'lishi mumkin. Bu narsani tushunishni osonlashtirish va chalkashmaslik uchun, tasavvur qiling-a, siz avval n o'zgaruvchining qiymatini m o'zgaruvchisiga belgilab qo'ygansiz, keyin esa n qiymatini bittaga oshirgansiz. Birinchi misolda siz avval n qiymatini bir marta oshirdingiz, keyin esa bu qiymatni m o‘zgaruvchisiga belgiladingiz.

Arifmetik operatorlar bilan hammasi shu. Albatta, ushbu oddiy operatorlardan foydalanishning ko'plab variantlari va nozik tomonlari mavjud, ammo bu sizga boshlash uchun etarli bo'ladi.

Taqqoslash operatorlari

Va yana matematikani eslaymiz. Belgilar hammaga va hammaga tanish. Dasturlashda ular deyiladi taqqoslash operatorlari... JavaScript quyidagi taqqoslash operatorlaridan foydalanadi:

< меньше
> ko'proq
<= меньше или равно
> = kattaroq yoki teng
== teng
= teng emas
=== qat'iy teng
! == mutlaqo teng emas

E'tibor bering, katta yoki teng belgisi => emas, balki> = kabi yoziladi. Ya'ni, o'q teng belgisidan keyin emas, balki oldinda.

Taqqoslash operatorlari o'zgaruvchilar qiymatlarini solishtirish imkonini beradi va bu operatsiya natijasi har doim mantiqiy qiymat rost yoki noto'g'ri bo'ladi. Ular odatda shartli iboralarda ishlatiladi. Keyinchalik kodning qaysi qismi bajarilishi taqqoslash qanday natija berishiga bog'liq.

JavaScript-da siz bir vaqtning o'zida turli xil ma'lumotlar turlarini taqqoslashingiz mumkin, masalan, raqam va satr:

12345 == "12345" // rost

Shunchaki, bu holda satr avtomatik ravishda raqamga aylanadi. Qat'iy tenglik === yoki tengsizlik!== faqat bir xil turdagi o'zgaruvchilarni solishtirganda qo'llaniladi.

Mantiqiy operatorlar

JavaScript-da mantiqiy operatsiyalar yangi boshlanuvchilar uchun qiyin mavzulardan biridir. Tilni o'zlashtirishda yanada muvaffaqiyatli borish uchun u bilan yaxshilab shug'ullanishga arziydi. Ular ko'pincha taqqoslash operatsiyalari bilan birgalikda ishlatiladi va mantiqiy qiymatni true yoki false qaytaradi.

Uchta mantiqiy operator mavjud:

&& (VA)
|| (YOKI)
! (YO'Q)

Mantiqiy operator && (VA)

&& operatori ikkita qiymat ustida mantiqiy AND amalini bajaradi. Biroq, agar ikkala operand ham rost bo'lsa, u haqiqatni qaytaradi. Agar bitta yoki ikkala operand noto'g'ri bo'lsa, operator yolg'onni qaytaradi. Misollar:

2 < 3 && 4 < 5 // true
2 < 3 && 5 < 4 // false
3 < 2 && 5 < 4 // false

Mantiqiy operatorlar taqqoslash operatorlariga qaraganda pastroq ustunlikka ega, shuning uchun bu misollarda qavslar kerak emas. Ko'rinib turibdiki, biz avval raqamlarni bir-birimiz bilan taqqoslaymiz va shundan keyingina mantiqni qo'llaymiz.

Mantiqiy operator || (YOKI)

Mantiqiy operator bilan || (YOKI) boshqa qo'shiq. Operator || ikkita operandda mantiqiy OR amalini bajaradi. Agar bitta yoki ikkala operand rost bo'lsa, u haqiqatni qaytaradi. Agar ikkala operand ham yolg'on bo'lsa, u noto'g'ri qaytaradi. Misollar:

2 < 3 || 4 < 5 // true
2 < 3 || 5 < 4 // true
3 < 2 || 5 < 4 // false

Mantiqiy operatorlarda bitta hiyla bor. Ular keraksiz ishlarni yoqtirmaydilar. Biroq, men shundayman. Ular har doim o'z hisoblarini chapdan o'ngga boshlaydilar. Agar ifodaning birinchi qismi ularning shartlariga mos kelsa, u holda ular ifodaning qolgan qismini ham baholamaydilar.

Misol uchun, agar operator || boshida haqiqiy qiymatni topadi, keyin darhol haqiqiy qiymatni beradi va qolganini endi tekshirmaydi. Shuningdek, && operatori, agar boshida noto'g'ri ifoda topsa, darhol noto'g'ri natija beradi, qolganini tekshirmaydi.

Yana bir xususiyat: AND operatorining && ustunligi OR || dan yuqori shuning uchun u oldinroq bajariladi:

2 < 3 || 4 < 5 && 5 < 6 // здесь сначала будет выполнено вычисление в правой части, а потом уже в левой

Mantiqiy operator! (YO'Q)

Mantiqiy operator! "mantiqiy EMAS" degan ma'noni anglatadi. U faqat bitta operand bilan ishlatiladi va ushbu operandning qiymatini o'zgartiradi. Agar n rost bo'lsa, N noto'g'ri bo'ladi. Bu operator faqat bitta operandga biriktirilishi mumkinligi sababli butun sonli ifodani invertatsiya qilish uchun uni qavs ichiga olish kerak!(N && m).

String operatorlari

Biz yuqorida string operatorlari haqida gapirgan edik. Bu string o'zgaruvchilarni ulash uchun ishlatiladigan bir xil plyus + yoki boshqa yo'l bilan - uchun birikmalar(satr qo'shish). Misol:

"Igor" + "Kventor" == "Igor Kventor"

E'tibor bering, birinchi so'zda yopilish tirnoqidan oldin bo'sh joy mavjud. Agar siz uni qo'shmasangiz, chiziqlar bir so'z bilan birlashadi "IgorKventor".

Bu operatorning bitta o'ziga xos xususiyati bor: agar ifodada kamida bitta satr bo'lsa, u va boshqa barcha argumentlar satr turiga olib keladi. Masalan:

Qolgan arifmetik operatorlar faqat raqamlar bilan ishlaydi va har doim argumentlarni raqamga aylantiradi.

Shartli operatorlar

JavaScript-da if va ? ikkita shartli iboralar mavjud: Garchi, aniqrog'i, if aslida boshqaruv bayonoti bo'lib, juda keng qamrovli bo'lib, juda ko'p yaxshiliklar va qiziqarli xususiyatlarga ega. Shuning uchun, bu haqda alohida maqola bo'ladi. Hozircha oddiyroq shartli operatorni ko'rib chiqamiz ?:

Odatda bu operator quyidagicha yoziladi?: Lekin dasturlarda u boshqacha ko'rinadi. U uchta operandga ega. Birinchi operand belgidan oldin keladimi? , ikkinchisi belgilar orasida? va: uchinchisi - keyin:

holat? qiymat 1: qiymat 2

Uning ishlashining ma'nosi oddiy: agar ko'rsatilgan shart bajarilsa, 1 qiymati qaytariladi, agar bajarilmasa - qiymat 2. Bu shartli operator ko'pincha if operatoriga alohida ehtiyoj bo'lmaganda, uni oddiyroq almashtirish vazifasini bajaradi. ikkinchisi. Bunday holda, yozuvning o'zi qisqartiriladi va uni o'qish osonroq bo'ladi.

Hozircha hammasi shu!

Umid qilamanki, siz JavaScript operatorlari bilan biroz tushunasiz. Miya qaynab ketmasligi uchun, dam olishingiz uchun qisqacha animatsiya - dasturchi hamma narsani qila oladi! :)