Brogrammist
1.18K subscribers
96 photos
9 videos
1 file
86 links
Veb-dasturlash bo'yicha kamtarona bilim va tajribalarimni ulashaman.

Sayt: https://diyorbek.blog

YouTube: https://youtube.com/@brogrammistuz

Insta: https://instagram.com/brogrammistuz
Download Telegram
Number'larning ham metodlari bor

JavaScript'da primitiv tiplar obyekt kabi ishlatilishi mumkin. Chunki primitivlarning metodlari yoki property'larini ishlatarkanmiz JS bizga o'sha primitivni mos obyekt bilan o'rab beradi (manbaa). Quyida aynan Number'larning "metod"larini ko'rib chiqamiz:

1. toExponential() - sonni eksponensial (mantissa va o'nning darajasi) ifodaga o'giradi.

const num = 12000;
num.toExponential(); // '1.2e+4'


"Exponential notation" atamasining o'zbekchasi bilsangiz, iltimos, kommentlarda qoldiring.


2. toFixed(n) - sonni o'nli kasrda ko'rinishida nuqtadan keyin n ta son qoldirgan holda ifodalaydi. n soni [0, 100] oralig'ida bo'lishi shart:

const num = 12000;
num.toFixed(2); // '12000.00'

const num1 = 3.141592;
num1.toFixed(1); // '3.1'
num1.toFixed(0); // '3'



3. toPrecision(n) - sonning n ta muhim raqamini saqlab qolgan holda eksponensial ko'rinishda ifodalaydi. n soni [1, 100] oralig'ida bo'lishi shart.
toFixed() dan farqi shuki, bu metod nuqtadan keyin emas, balki sonning boshidan boshlab muhim raqamlani hisobga oladi:

(12).toPrecision(4); // '12.00'
(1234).toPrecision(2); // '1.2e+4'
(1234).toPrecision(3); // '1.23e+4'
👍5🤔1
4. toString(radix) - sonnni boshqa sanoq sistemasiga o'girib beradi:

// 10 likdan 16 likka
(1234).toString(16); // '4d2'

// 10 likdan 8 likka
(789).toString(8); // '1425'

// 10 likdan 2 likka
(123).toString(2); // '1111011'

// 16 likdan 10 likka
(0x5ac).toString(10); // '1452'

// 8 likdan 10 likka
(0123).toString(10); // '83'

Xullas, istagancha konvertatsiya qilavaramiz.
Shuni sezib qoldimki radix parametri istalgan son bo'lishi mumkin ekan, faqat 2-lik, 8-lik kabilar emas:

// 8 likdan 5 likka
(065).toString(5); // '203'

// 16 likdan 27 likka
(0xdac).toString(27); // '4lh'

Zo'r-a?

#js #jsdaily #tips
👍28😁1
Number'larni toString(?radix) orqali istalgan sanoq sistemasiga o'tkazish mukinligini ko'rdik. Aytib o'tish kerak, bu yerda radix parametri [2, 36] intervalida bo'lishi kerak. Aks holda metod xatolik otadi. `radix`ning o'zi ixtiyoriy parametr va "default" qiymati 10 ga teng.
👍6
Aytgancha, sonlarni boshqa sanoq sistemalardan 10 likka o'tkazish uchun Number.parseInt(string, ?radix) metodidan foydalanamiz. parseInt ham global funksiya bo'lgani uchun, shunchaki o'zini ishlatsa ham bo'ladi, ya'ni Number.parseInt qilib o'tirmasdan:

// 16 likdan 10 likka
parseInt('ff', 16); // 255

// 13 likdan 10 likka
parseInt('c', 13); // 12


parseInt asosan, o'z nomi bilan, "integer" (butun son) qiymatni berilgan string'dan o'qish uchun ishlatiladi. Masalan o'nli kasrning butun qismini olish yoki string'ni number'ga aylantirish uchun:

parseInt('12.34'); // 12
parseInt('-45'); // -45

String'ni number'ga o'girishning boshqa usullari ham bor. Ularning farqlari haqida keyingi postlarda yozishga harakat qilaman.
👍21
Copy&Paste'ni bloklash

Web-dasturingiz foydalanuvchilaridan qarg'ish olishni xohlaysizmi? Samarali usullaridan biri "copy&paste" imkoniyatini taqiqlash bo'lsa kerak:

const input = document.querySelector('input');

input.addEventListener(
'copy',
event =>
event.preventDefault()
);

input.addEventListener(
'paste',
event =>
event.preventDefault()
);
👍30😁2😱1
Brogrammist
Copy&Paste'ni bloklash Web-dasturingiz foydalanuvchilaridan qarg'ish olishni xohlaysizmi? Samarali usullaridan biri "copy&paste" imkoniyatini taqiqlash bo'lsa kerak: const input = document.querySelector('input'); input.addEventListener( 'copy', event…
Albatta "copy&paste" imkoniyatini bloklash ba'zida o'rinli. Masalan, foydalanuvchi email yoki parolini tasdiqlash uchun yana kiritishi kerak bo'lsa, "paste"ni o'chirib qo'yish mumkin. Yoki, shunga o'xshash "himoyalanishi" kerak bo'lgan ma'lumotlarni "himoyalash" uchun.

Siz o'zingiz bu imkoniyatni qanday holatlarda bloklash o'rinli deb o'ylaysiz?

Nega "himoya"ni qo'shtirnoq ichida yozganimni hamma tushundi degan umiddaman.
👍15😁3
Proxy obyektini bilarmidingiz?

Proxy(object, handler) bizga obyektlar uchun proksi obyekt yaratish imkonini beradi. Bu bilan biz obyetklardagi fundamental operatsiyalarni "intercept/override" qilishimiz mumkin. Ya'ni ularni o'zimizga kerakli ravishda ishlaydigan qila olamiz.

Masalan, eng sodda misol, obyektda biz bergan maydon bo'lmasa "undefined" o'rniga defolt qiymat qaytarish:

const dict = {
defolt: "default",
maydon: "field",
};

const proxy = new Proxy(dict, {
get(target, key, receiver) {
// agar `key` mavjud bo'lsa,
// mos qiymat qaytaramiz
if (target[key])
return target[key];

// agar `key` yo'q bo'sa,
// `key`ning o'zini
return key;
},
});

console.log(proxy.maydon);
// "field"
console.log(proxy.nimadir);
// "nimadir
"


Yoki setterga validatsiya qo'shishimiz mumkin:

const proxy = new Proxy(dict, {
set(target, key, val) {
if (typeof val !== "string")
throw new TypeError("Faqat string qiymatlar olinadi!");

target[key] = val;
return true;
},
});



Aytgancha, proksi obyekt birinchi obyektimizni to'liq "overwrite" qilishi kerak. Chunki ularning ikkovi ham kodimizda bo'lishi chalkash holatlarni yuzaga keltiradi. Shuning uchun har doim bunday qiling:

let obj = {...};

obj = new Proxy(obj, handler);
👍13
"Eee akaa, bu bo'ganku! Obyektlarda getter/setter'lar bor-ku o'zi!"

deyotgan bo'lsangiz, haqsiz. Lekin Array'da getter/setter yo'q-ku!

let ages = [12, 6, 75];

ages = new Proxy(ages, {
set(target, key, val) {
if (typeof val !== "number")
throw new TypeError("Faqat son qiymatlar olinadi!");

if (val < 0 || val > 120)
throw new TypeError("Odamlar buncha yashamaydi!");

target[key] = val;
return true;
},
});
👍15
Yana bir zo'r use-case bu funksiyalarni proksilash. Aytaylik qandaydir kutubxonadan foydalanyapmiz va uning o'znini o'zgartirolmasak, uni proksilashimiz mumkin:

import fancy from "fancy";

fancy = new Proxy(fancy, {
apply(target, thisArg, argumentList) {
return Reflect.apply(
target,
thisArg,
argumentList
);
},
});


Albatta buni soddaroq qilib, funksiyani yangi funksiya bilan o'rab ishlatsak ham bo'ladi. Asosiysi holatga qarab, vaziyatga eng mos tushadigan usuldan foydalanish.
👍16
JavaScript'ning sinxronligi

Oldin JavaScript nimaligiga javob beraylik. JavaScript bu - ECMAScript spetsifikatsiyasi bo'yicha ishlab chiqilgan til. Ya'ni ECMAScript bu - standart, JavaScript esa o'sha standartning implementatsiyasi. (Yuzaki tushuntirish bo'ldi,chunki bu mavzu uchun alohida post yozsa arziydi.)

JS kodimiz ishga tusharkan, interpretator kodimizni o'ngdan chapga, tepadan pastga qatorma-qator o'qishini bilamiz. Bizning yozgan har bitta amal ketma-ket, sinxron ravishda bajariladi. Masalan:

function bigProcess() {
let sum = 0;
let i = 100000000;

while (i--) sum += i;

return sum;
}

console.log("start");
console.log(bigProcess());
console.log("end");


Natija:
> start
> 4999999950000000
> end


Ko'rinib turibdiki, "bigProcess()" tugamas ekan, undan keyingi kodimiz ishga tushmaydi. Ya'ni kodimiz bajarilishi shu joyda bloklanib qoladi. Eng yomon tarafi, bu kodni brauzerda ishlatarkanmiz, bu og'ir operatsiya oxiriga yetmaguncha butun sahifa qotib qoladi. Hatto CSS bilan yozilgan animatsiyalargacha muzlaydi.

Buning sababi, JS "single-threaded"(shunga o'zbekcha nom topish kerak) va veb-sahifadagi barcha operatsiyalar o'sha thread'da bajariladi. Bunga HTML'ni taxlil qilinishi ham, CSS stillarni biriktirilish ham kiradi. Bularning barchasini esa hosdisalar sikli ("event loop") ma'lum ketma-ketlikda bajarilishini taminlaydi. Hodisalar sikli "call stack"ni, "callback queue"ni, DOMdagi o'rgarishlarni va boshqalarni kuzatib turadi. Ularning birortasida qilinadigan ish paydo bo'lsa, o'sha ishlar asosiy "thread"da bajariladi.

"Event loop" mavzusining o'zi ham juda katta va qiziq mavzu. Bu haqida ham keyinroq post yozaman.
👍22
Yuqoridagi tushunchalarni iloji boricha soddaroq va qisqaroq ifodalashga harakat qildim. Lekin nistaban chuqurroq mavzular bo'lgani uchun bu oson emas. Agar savollar bo'lsa bemalol so'rayverasizlar. 🙂
👍13
JavaScript'ning asinxronligi

Bundan oldingi postda JS'ning sinxronligi va shuning uchun uzoq bajariladigan operatsiyalar asosiy thread'ni bloklab qoyishini yozgandim. Bu postda esa, asosiy-thread’ni bloklamaydigan asinxron JavaScript haqida gaplashamiz.

JavaScript’dagi asinxron operatisyalarni quyidagi ketma-ketlik bilan tariflash mumkin:

1. Ma’lum bir funksiyani chaqirish orqali bajarilishi uzoq vaqt oladigan operatsiyani boshlash.

2. Funksiya operatsiyani boshlagandan so’ng darhol “return” qilishi (ya’ni ishini tugatishi) va boshqa amallarni bajarishda davom etishi.

3. Qachonki o’sha operatsiya tugaganda notifikatsiya olish.

Asinxron operatsiyaga eng oddiy misol bu veb-sahifadagi event’lar bilan ishlash:

button.addEventListener(
'click',
() => console.log('Tugma bosildi!')
);

Tepadagi misolda addEventListener metodini chaqirganimizda dasturimiz shu joyda to’xtab qolmaydi. Ya’ni, qachon “click” sodir bolarkan demasdan undan keyingi keladigan ishlarni bajarishda davom etaveradi. Qachondir “click” sodir bo’lganidagina, biz registratsiya qilgan callback/handler funksiyamiz chaqirladi.

setTimeout(() => {
console.log('Vaqt tugadi');
}, 1000);

setTimeout funksiyasi ham asinxron operatsiya bajaradi. Uni chaqirganimizda, orqa fonda taymer ishga tushadi va taymer vaqti tugab, ishini yakunlarkan, biz bergan callback chaqiriladi.

Umuman olganda, JavaScript’dagi barcha asinxron amallar event tushunchasi bilan bog’liq: qandaydir operatsiya orqa fonda bajariladi va u tugagach unga mos event sodir bo’lgani haqida notifikatsiya beriladi.

Shu joyda bir narsani yodda sanqlang: asinxron operatsiyalar (event sodir bolishini, network request javobini yoki taymerni kutish) orqa fonda bajariladi, ularning callback/handler’lari esa asosiy thread’da ishga tushadi. Shuning uchun bu asinxron operatsiyalar asosiy thread’ni bloklamasa ham, ulardan keyin qilinadigan operatsiyalar (biz bergan handler’lar) uni bloklab qo’yishi mumkin.

To be continued. Keyingi post Promise haqida.
👍12
Foydalanuvchi button'ni bosganida ushbu kod boyicha loglarimiz qaysi ketma-ketlikda bo'ladi?
👍8😁1🤔1
Hammaga assalomu alaykum! Kanalga tez-tez post qilolmayatganim uchun meni ma'zur tutasiz degan umiddaman.

Quyida kechagi "viktorina"ning javobi va tahlili.

To'g'ri javob nisbatan ko'p ovoz to'pladi. Lekin bu 41%. Demak javob berganlarning yarmidan ko'pi javobda adashgan. Bu tahlil orqali ko'pchilik to'g'ri javobni yaxshi tushunib oladi degan umiddaman.

Xatolar bo'lishi tabiiy. Shuning uchun firklaringizni izohlarda qoldirsangiz minnatdor bo'lar edim.

Barchaga tashakkur.
👍4
Xo'sh, shu kod bo'yicha "click" hodisasini JS'ning o'zidan chaqirsak-chi? Natija qanday bo'ladi?
👍4