JavaScript — 0 dan Expertgacha (O'zbek tilida)¶
📚 README · ← 5-qism (1-bo'lim) · Keyingi: 6-qism (1-bo'lim) — Expert →
5-QISM: CHUQUR JS — 2-bo'lim Zamonaviy JS xususiyatlari, modullar, xato boshqaruvi va regex. Har bir moduldan keyin 20 ta masala (yechimi bilan). Bu bo'lim 5-qismni yakunlaydi.
1-bo'limda OOP yadrosini (closures,
this, prototypes, classes) ko'rdik. Endi real loyihaga kerakli zamonaviy vositalar.
21-MODUL: ES6+ va modullar¶
Allaqachon bilganlaring (qisqa takror)¶
Quyidagilarni oldingi qismlarda ishlatgansan — bular ham ES6+:
let, const // 1-modul
`Salom ${ism}` // template literal — 1-modul
(a, b) => a + b // arrow function — 5-modul
function f(x = 10) {} // default param — 5-modul
function f(...args) {} // rest param — 5-modul
const [a, b] = arr; // array destructuring — 6-modul
const { x, y } = obj; // object destructuring — 7-modul
[...arr1, ...arr2] // spread — 6/7-modul
obj?.manzil?.shahar // optional chaining — 7-modul
Endi yangilarini ko'ramiz.
Nullish coalescing ?? (vs ||)¶
?? — chap tomon null yoki undefined bo'lsa, o'ng tomonni beradi. ||dan farqi: 0, "", falseni "haqiqiy qiymat" deb hisoblaydi:
const a = 0;
console.log(a || 100); // 100 — chunki 0 falsy
console.log(a ?? 100); // 0 — chunki 0 null/undefined emas!
const ism = "";
console.log(ism || "Mehmon"); // "Mehmon" (bo'sh string falsy)
console.log(ism ?? "Mehmon"); // "" (bo'sh string mavjud qiymat)
Why
??:||har qanday "falsy" qiymatni almashtiradi — bu0yoki""haqiqiy qiymat bo'lganda muammo (masalan, soni0ta mahsulot).??faqatnull/undefinedni almashtiradi. Qiymat yo'qligini tekshirmoqchi bo'lsang??, "falsy"likni tekshirmoqchi bo'lsang||.
Logical assignment (??=, ||=, &&=)¶
let sozlama;
sozlama ??= "default"; // null/undefined bo'lsa tayinlaydi -> "default"
let ism = "";
ism ||= "Mehmon"; // falsy bo'lsa tayinlaydi -> "Mehmon"
let user = { faol: true };
user.faol &&= "ha"; // truthy bo'lsa tayinlaydi -> "ha"
Optional chaining — funksiya va massiv bilan¶
const obj = {
salom() { return "Salom"; },
};
console.log(obj.salom?.()); // "Salom" — metod bor, chaqiriladi
console.log(obj.xayr?.()); // undefined — metod yo'q, xato emas
const arr = null;
console.log(arr?.[0]); // undefined — massiv null, xato emas
Set — unikal qiymatlar to'plami¶
Set — takrorlanmaydigan qiymatlar to'plami:
const s = new Set([1, 2, 2, 3, 3, 3]);
console.log(s); // Set(3) {1, 2, 3} — dublikatlar yo'q
s.add(4); // qo'shish
console.log(s.has(2)); // true — bormi?
s.delete(1); // o'chirish
console.log(s.size); // 3 — nechta?
// Bo'ylab aylanish:
for (const el of s) console.log(el);
Eng ko'p ishlatiladigan joy — massivdan dublikatlarni olib tashlash:
const arr = [1, 1, 2, 3, 3, 4];
const unikal = [...new Set(arr)];
console.log(unikal); // [1, 2, 3, 4]
Map — kalit-qiymat to'plami (har qanday kalit)¶
Map — obyektga o'xshash, lekin kalit har qanday tur bo'lishi mumkin (obyekt, funksiya, son):
const m = new Map();
m.set("ism", "Oqil");
m.set(1, "son kalit");
m.set(true, "boolean kalit");
console.log(m.get("ism")); // "Oqil"
console.log(m.has(1)); // true
m.delete(true);
console.log(m.size); // 2
// Bo'ylab aylanish:
for (const [kalit, qiymat] of m) {
console.log(kalit, qiymat);
}
Why
Mapvs Object: (1) Kalit har qanday tur bo'lishi mumkin (Object'da faqat string/symbol). (2).sizebor (Object'daObject.keys().lengthkerak). (3) Qo'shilish tartibi kafolatlangan. (4) Prototype kalitlari aralashmaydi. Tez-tez qo'shilib-o'chiriladigan, kalitlari noma'lum bo'lgan ma'lumot uchunMapishlat; sobit strukturali yozuv uchun Object.
⭐ ES Modullar — import / export¶
Real loyihada kod bir nechta faylga bo'linadi. Modullar — bir fayldagi funksiya/o'zgaruvchini boshqa faylda ishlatish imkonini beradi.
Named export / import¶
// 📄 matematika.js
export const PI = 3.14159;
export function qoshish(a, b) { return a + b; }
export function ayirish(a, b) { return a - b; }
// 📄 main.js
import { PI, qoshish, ayirish } from "./matematika.js";
console.log(qoshish(2, 3)); // 5
console.log(PI); // 3.14159
// Nom o'zgartirish:
import { qoshish as plus } from "./matematika.js";
// Hammasini namespace sifatida:
import * as mat from "./matematika.js";
console.log(mat.qoshish(1, 2)); // 3
Default export / import¶
Bir faylda bitta default export bo'ladi (asosiy narsa):
// 📄 main.js
import User from "./User.js"; // qavssiz, istalgan nom bilan
const u = new User("Oqil");
Ikkalasini birga¶
Brauzerda ishlatish¶
Why modullar: (1) Kod tartibli — har fayl o'z vazifasini bajaradi (single responsibility). (2) Faqat kerakli narsani import qilasan. (3) Vue/Nuxt, React — hammasi modullar ustiga qurilgan. Eslatma: brauzerda
type="module"kerak, yo'llar./bilan va.jskengaytmasi bilan yoziladi; Node'dapackage.jsonda"type": "module". Bundler (Vite) bu tafsilotlarni o'zi hal qiladi.
📝 21-modul masalalari (20 ta)¶
0 || 5va0 ?? 5natijalarini taqqoslang."" || "X"va"" ?? "X"natijalarini taqqoslang.??=bilanundefinedo'zgaruvchiga default tayinlang.||=bilan bo'sh stringga qiymat tayinlang.obj.metod?.()— metod bor va yo'q holatlarni sinab ko'ring.arr?.[0]— massivnullbo'lganda xato bermasligini ko'rsating.new Set([1,1,2,3,3])yaratib, natijasini chiqaring.- Massiv
[5,5,1,2,2,8]dan dublikatlarniSetbilan olib tashlang. - Set:
add,has,delete,sizeni ishlating. - Set bo'ylab
for...ofbilan aylaning. Mapyaratib,set/getqiling.- Map'ga son va boolean kalit qo'shing (har qanday tur).
- Map:
has,delete,sizeni ishlating. - Map bo'ylab
[kalit, qiymat]bilan aylaning. MapvaObjectfarqini bitta misolda ko'rsating.- Modul:
matematika.jsyozing —qoshish,PIni export qiling (named). - Modul: uni
main.jsda import qilib ishlating. - Modul: default export'li
Userclass yozing va import qiling. - Modul:
import * asbilan namespace import yozing. - Murakkab: kichik loyiha —
utils.js(bir nechta export),main.js(default + named import birga). To'liq strukturani yozing.
► Yechimlar
// 1 -> 5 va 0
console.log(0 || 5); // 5
console.log(0 ?? 5); // 0
// 2 -> "X" va ""
console.log("" || "X"); // "X"
console.log("" ?? "X"); // ""
// 3
let s3;
s3 ??= "default";
console.log(s3); // "default"
// 4
let ism4 = "";
ism4 ||= "Mehmon";
console.log(ism4); // "Mehmon"
// 5
const o5 = { salom() { return "Salom"; } };
console.log(o5.salom?.()); // "Salom"
console.log(o5.xayr?.()); // undefined
// 6
const a6 = null;
console.log(a6?.[0]); // undefined
// 7
console.log(new Set([1, 1, 2, 3, 3])); // Set(3) {1,2,3}
// 8
console.log([...new Set([5, 5, 1, 2, 2, 8])]); // [5,1,2,8]
// 9
const s9 = new Set();
s9.add("a"); s9.add("b");
console.log(s9.has("a")); // true
s9.delete("a");
console.log(s9.size); // 1
// 10
for (const el of new Set([1, 2, 3])) console.log(el);
// 11
const m11 = new Map();
m11.set("ism", "Oqil");
console.log(m11.get("ism")); // "Oqil"
// 12
const m12 = new Map();
m12.set(1, "son"); m12.set(true, "bool");
console.log(m12.get(1), m12.get(true)); // "son" "bool"
// 13
const m13 = new Map([["a", 1], ["b", 2]]);
console.log(m13.has("a")); // true
m13.delete("a");
console.log(m13.size); // 1
// 14
const m14 = new Map([["x", 10], ["y", 20]]);
for (const [k, v] of m14) console.log(`${k}=${v}`);
// 15
const obj = {}; obj[1] = "a"; obj["1"] = "b"; // son kalit string'ga aylanadi -> bitta kalit
console.log(Object.keys(obj).length); // 1
const map = new Map(); map.set(1, "a"); map.set("1", "b"); // ikki xil kalit
console.log(map.size); // 2
// 16, 17 — named export/import
// 📄 matematika.js
// export const PI = 3.14159;
// export function qoshish(a, b) { return a + b; }
// 📄 main.js
// import { PI, qoshish } from "./matematika.js";
// console.log(qoshish(2, 3)); // 5
// 18 — default export/import
// 📄 User.js
// export default class User { constructor(ism){ this.ism = ism; } }
// 📄 main.js
// import User from "./User.js";
// const u = new User("Oqil");
// 19 — namespace
// import * as mat from "./matematika.js";
// console.log(mat.qoshish(1, 2)); // 3
// 20 — kichik loyiha
// 📄 utils.js
// export const APP = "EduCore";
// export function formatla(son) { return son.toLocaleString(); }
// export default function log(x) { console.log("[LOG]", x); }
// 📄 main.js
// import log, { APP, formatla } from "./utils.js";
// log(APP); // [LOG] EduCore
// console.log(formatla(1000000)); // "1,000,000"
22-MODUL: Error handling (xato boshqaruvi)¶
Yaxshi dastur — xato chiqqanda qulamaydigan dastur. Xatolarni to'g'ri ushlash va boshqarish — professional kodning belgisi.
try / catch / finally¶
try {
// xato chiqishi mumkin bo'lgan kod
const data = JSON.parse("noto'g'ri json");
} catch (xato) {
// xato bo'lsa shu ishlaydi
console.log("Xato yuz berdi:", xato.message);
} finally {
// har holda ishlaydi (xato bo'lsa ham, bo'lmasa ham)
console.log("Tugadi");
}
try— "xavfli" kod.catch— xato bo'lsa ushlaydi (xato obyektini beradi).finally— natijadan qat'i nazar (tozalash uchun: faylni yopish, loading'ni o'chirish).
throw — xato tashlash¶
Biror narsa noto'g'ri bo'lsa, o'zing xato "tashlashing" mumkin:
function yoshTekshir(yosh) {
if (yosh < 0) {
throw new Error("Yosh manfiy bo'lishi mumkin emas");
}
return yosh;
}
try {
yoshTekshir(-5);
} catch (e) {
console.log(e.message); // "Yosh manfiy bo'lishi mumkin emas"
}
Why
Errorobyekti, string emas:throw "xato"deb string tashlama —throw new Error("xato")deb tashla. Sababi:Errorobyektida.message,.name, va.stack(xato qayerda bo'lganini ko'rsatadigan iz) bo'ladi. String'da bu yo'q — debug qiyinlashadi.
Error obyektining xususiyatlari¶
try {
throw new Error("Nimadir buzildi");
} catch (e) {
console.log(e.name); // "Error"
console.log(e.message); // "Nimadir buzildi"
console.log(e.stack); // xato izi (qayerda, qaysi qatorda)
}
Built-in xato turlari¶
JS'da tayyor xato turlari bor:
// TypeError — noto'g'ri turdagi amal:
null.foo; // TypeError: Cannot read properties of null
// ReferenceError — mavjud bo'lmagan o'zgaruvchi:
console.log(yoq); // ReferenceError: yoq is not defined
// RangeError — ruxsat etilgan diapazondan tashqari:
new Array(-1); // RangeError
// SyntaxError — noto'g'ri sintaksis:
JSON.parse("{xato}"); // SyntaxError
Custom error class'lar¶
O'z xato turlaringni yaratish (20-moduldagi class + extends):
class ValidationError extends Error {
constructor(message, maydon) {
super(message);
this.name = "ValidationError";
this.maydon = maydon; // qo'shimcha ma'lumot
}
}
try {
throw new ValidationError("Email noto'g'ri", "email");
} catch (e) {
console.log(e.name); // "ValidationError"
console.log(e.maydon); // "email"
}
Why custom error: Turli xil xatolarni farqlash uchun.
catchdaif (e instanceof ValidationError)deb tekshirib, har xil xatoni har xil boshqarasan. (Laravel'dagi custom Exception class'lar bilan bir xil g'oya — sen buni bilasan.)
Aniq xatoni ushlash va qayta tashlash¶
try {
// ...
} catch (e) {
if (e instanceof ValidationError) {
console.log("Validatsiya xatosi:", e.message);
} else {
throw e; // noma'lum xatoni qayta tashlaymiz (yashirib qo'ymaymiz)
}
}
Why qayta tashlash: Faqat boshqara oladigan xatolarni ushla. Noma'lum xatolarni
catchda yutib yuborma (catch {}bo'sh qoldirma) — ularni qayta tashla yoki log qil. Yashirilgan xato — eng yomon bug.
Async/await'da xato (4-qismdan davom)¶
async function malumotOl() {
try {
const res = await fetch("https://api.uz/data");
if (!res.ok) throw new Error(`Server xatosi: ${res.status}`);
return await res.json();
} catch (e) {
console.log("Xato:", e.message);
return null; // yoki xatoni qayta tashlash
}
}
📝 22-modul masalalari (20 ta)¶
try/catchbilanJSON.parse("xato")xatosini ushlang.- Ushlangan xatoning
.messageini chiqaring. throw new Error(...)bilan xato tashlang.- Funksiya ichida xato tashlab, tashqarida ushlang.
finallyhar holda ishlashini ko'rsating (xato bor va yo'q holatda).- Xatoning
.nameva.messageini ajratib chiqaring. TypeErrorni ataylab keltirib chiqaring (null.foo).yoshTekshir(yosh)— manfiy bo'lsa xato tashlasin.- Validatsiya funksiyasi: bo'sh string bo'lsa xato tashlasin.
- Why: string tashlash vs
Errortashlash farqini ko'rsating. - Custom
ValidationErrorclass yozing (extends Error). - Custom error tashlab,
instanceofbilan tekshiring. - Custom error'ga qo'shimcha xususiyat (
maydon) qo'shing. - Noma'lum xatoni
catchda qayta tashlang (throw e). - Ikki xil xatoni (
ValidationErrorva boshqa) har xil boshqaring. asyncfunksiyadatry/catchbilan xato ushlang.- Custom error'ga
statusCodeqo'shing (HTTP uchun). - Ichma-ich
try/catchyozing. - "Xavfsiz" funksiya:
[xato, natija]ko'rinishida qaytarsin (Go uslubi). - Murakkab: Validatsiya tizimi —
ValidationError(maydon bilan); user obyektini tekshiruvchi funksiya (ism, email, yosh); xatolarni ushlab, qaysi maydonda ekanini ko'rsating.
► Yechimlar
// 1, 2
try { JSON.parse("xato"); }
catch (e) { console.log(e.message); } // "Unexpected token..."
// 3
try { throw new Error("Buzildi"); }
catch (e) { console.log(e.message); }
// 4
function f4() { throw new Error("Funksiya xatosi"); }
try { f4(); } catch (e) { console.log(e.message); }
// 5
function test5(xatomi) {
try { if (xatomi) throw new Error("X"); console.log("ok"); }
catch (e) { console.log("catch"); }
finally { console.log("finally"); }
}
test5(false); // ok, finally
test5(true); // catch, finally
// 6
try { throw new Error("Xabar"); }
catch (e) { console.log(e.name, "-", e.message); } // "Error - Xabar"
// 7
try { null.foo; } catch (e) { console.log(e.name); } // "TypeError"
// 8
function yoshTekshir(y) {
if (y < 0) throw new Error("Yosh manfiy bo'lmasin");
return y;
}
try { yoshTekshir(-5); } catch (e) { console.log(e.message); }
// 9
function ismTekshir(ism) {
if (ism.trim() === "") throw new Error("Ism bo'sh bo'lmasin");
return ism;
}
// 10
// throw "xato" -> e string bo'ladi, .message/.stack yo'q
// throw new Error("xato") -> e obyekt, .message va .stack bor (debug oson)
// 11, 12, 13
class ValidationError extends Error {
constructor(message, maydon) {
super(message);
this.name = "ValidationError";
this.maydon = maydon;
}
}
try { throw new ValidationError("Email xato", "email"); }
catch (e) {
console.log(e instanceof ValidationError); // true
console.log(e.maydon); // "email"
}
// 14
function f14() {
try { throw new TypeError("Tur xatosi"); }
catch (e) {
if (e instanceof ValidationError) console.log("validatsiya");
else throw e; // qayta tashlanadi
}
}
try { f14(); } catch (e) { console.log("Tashqarida:", e.name); } // "TypeError"
// 15
function boshqar(e) {
if (e instanceof ValidationError) console.log("Validatsiya:", e.message);
else console.log("Boshqa xato:", e.message);
}
// 16
async function f16() {
try { await Promise.reject(new Error("Async xato")); }
catch (e) { console.log(e.message); }
}
f16();
// 17
class ApiError extends Error {
constructor(message, statusCode) {
super(message);
this.name = "ApiError";
this.statusCode = statusCode;
}
}
try { throw new ApiError("Topilmadi", 404); }
catch (e) { console.log(e.statusCode); } // 404
// 18
try {
try { throw new Error("ichki"); }
catch (e) { throw new Error("tashqi: " + e.message); }
} catch (e) { console.log(e.message); } // "tashqi: ichki"
// 19 — Go uslubi
function xavfsiz(fn) {
try { return [null, fn()]; }
catch (e) { return [e, null]; }
}
const [xato, natija] = xavfsiz(() => JSON.parse("{}"));
console.log(xato, natija); // null {}
// 20 — Validatsiya tizimi
class ValError extends Error {
constructor(msg, maydon) { super(msg); this.name = "ValError"; this.maydon = maydon; }
}
function userTekshir(user) {
if (!user.ism || user.ism.length < 3) throw new ValError("Ism ≥ 3", "ism");
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(user.email)) throw new ValError("Email xato", "email");
if (user.yosh < 0 || user.yosh > 150) throw new ValError("Yosh noto'g'ri", "yosh");
return true;
}
try {
userTekshir({ ism: "Oqil", email: "xato", yosh: 25 });
} catch (e) {
console.log(`Xato (${e.maydon}): ${e.message}`); // "Xato (email): Email xato"
}
23-MODUL: Regular expressions (Regex)¶
Regex — matn naqshlari bilan ishlash vositasi: tekshirish (validatsiya), qidirish, almashtirish. Boshida qo'rqinchli ko'rinadi, lekin asoslarini bilsang juda kuchli.
Regex yaratish va test¶
const naqsh = /salom/; // literal (eng ko'p)
const naqsh2 = new RegExp("salom"); // konstruktor (dinamik holatda)
console.log(naqsh.test("salom dunyo")); // true — matnda bormi?
console.log(naqsh.test("xayr")); // false
Bayroqlar (flags)¶
/salom/g // global — barcha mosliklarni topadi (faqat birinchi emas)
/salom/i // insensitive — katta-kichik harfni farqlamaydi
/salom/m // multiline — ko'p qatorli matn uchun
const re = /a/gi;
console.log("Apple aA".match(re)); // ["A", "a", "A"]
Maxsus belgilar (character classes)¶
\d // har qanday raqam (0-9)
\w // harf, raqam yoki _ (so'z belgisi)
\s // bo'sh joy (probel, tab, yangi qator)
. // har qanday belgi (yangi qatordan tashqari)
\D \W \S // teskarisi (raqam EMAS, so'z belgisi EMAS, probel EMAS)
console.log(/\d/.test("abc5")); // true — raqam bormi?
console.log("a1b2c3".match(/\d/g)); // ["1","2","3"]
Anchorlar (boshi/oxiri)¶
^ // matn boshi
$ // matn oxiri
console.log(/^salom/.test("salom dunyo")); // true — "salom" bilan boshlanadimi?
console.log(/dunyo$/.test("salom dunyo")); // true — "dunyo" bilan tugaydimi?
console.log(/^abc$/.test("abc")); // true — to'liq "abc" mi?
Miqdorlar (quantifiers)¶
* // 0 yoki ko'p marta
+ // 1 yoki ko'p marta
? // 0 yoki 1 marta (ixtiyoriy)
{n} // aniq n marta
{n,m} // n dan m gacha
{n,} // kamida n marta
console.log(/\d+/.test("abc")); // false — kamida 1 raqam yo'q
console.log(/^\d{4}$/.test("2024")); // true — aniq 4 ta raqam
console.log("aaa".match(/a+/)); // ["aaa"]
To'plamlar va guruhlar¶
[abc] // a, b yoki c
[a-z] // a dan z gacha
[0-9] // raqam (= \d)
[^abc] // a, b, c EMAS
(...) // guruh (ushlab oladi)
a|b // a YOKI b
console.log(/[aeiou]/.test("xyz")); // false — unli yo'q
console.log(/^(ha|yoq)$/.test("ha")); // true
match, replace, matchAll¶
// match — mosliklarni topadi:
console.log("Narx: 100, 200, 300".match(/\d+/g)); // ["100","200","300"]
// replace — almashtiradi:
console.log("salom dunyo".replace(/dunyo/, "JS")); // "salom JS"
console.log("a-b-c".replace(/-/g, "+")); // "a+b+c"
// Guruh bilan almashtirish ($1):
console.log("2024-01-15".replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1"));
// "15/01/2024" — kun/oy/yil
Amaliy naqshlar¶
// Email:
const email = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(email.test("oqil@mail.uz")); // true
// O'zbek telefon (+998 va 9 ta raqam):
const tel = /^\+998\d{9}$/;
console.log(tel.test("+998901234567")); // true
// Faqat raqamlar:
const faqatSon = /^\d+$/;
console.log(faqatSon.test("12345")); // true
// Matndan barcha sonlarni ajratish:
console.log("3 ta olma, 5 ta uzum".match(/\d+/g)); // ["3","5"]
Why regex (va ehtiyotkorlik): Regex — validatsiya, qidirish, ma'lumot ajratishda tengsiz. Lekin (1) murakkab regex'ni o'qish qiyin — izoh yoz; (2) email kabi narsalar uchun haddan tashqari murakkab regex yozma — oddiy
/^[^\s@]+@[^\s@]+\.[^\s@]+$/99% holatda yetarli; (3) noma'lum regex'ni regex101.com'da sinab ko'r.
📝 23-modul masalalari (20 ta)¶
/salom/regex yaratib,testbilan matnda borligini tekshiring.ibayrog'i bilan katta-kichik harfsiz qidiring.\dbilan matnda raqam borligini tekshiring.gbayrog'i bilan barcha raqamlarnimatchqiling.\wva\sni ishlatib ko'ring.^va$bilan boshlanish/tugashni tekshiring.+bilan "kamida bitta raqam" ni tekshiring.{4}bilan aniq 4 ta raqamni tekshiring (yil).{2,4}bilan 2-4 ta belgini tekshiring.?bilan ixtiyoriy belgini tekshiring (colou?r).[aeiou]bilan unli harf borligini tekshiring.[^0-9]bilan raqam bo'lmagan belgi borligini tekshiring.(ha|yoq)guruh va alternatsiya bilan tekshiring.replacebilan barcha-larni/ga almashtiring.- Guruh
$1bilan sananiyyyy-mm-dddandd/mm/yyyyga aylantiring. - Matndan barcha sonlarni ajratib oling (
"5 olma, 3 nok"). - Email'ni regex bilan tekshiring.
- O'zbek telefon raqamini (
+998XXXXXXXXX) tekshiring. splitni regex bilan: bir nechta ajratuvchi (,;probel) bo'yicha bo'ling.- Murakkab: parol kuchini tekshiring — kamida 8 belgi, kamida 1 katta harf, 1 kichik harf, 1 raqam (har birini alohida regex bilan).
► Yechimlar
// 1
console.log(/salom/.test("salom dunyo")); // true
// 2
console.log(/salom/i.test("SALOM")); // true
// 3
console.log(/\d/.test("abc5")); // true
// 4
console.log("a1b2c3".match(/\d/g)); // ["1","2","3"]
// 5
console.log(/\w/.test("_")); // true
console.log(/\s/.test("a b")); // true
// 6
console.log(/^salom/.test("salom dunyo")); // true
console.log(/dunyo$/.test("salom dunyo")); // true
// 7
console.log(/\d+/.test("abc")); // false
console.log(/\d+/.test("abc1")); // true
// 8
console.log(/^\d{4}$/.test("2024")); // true
console.log(/^\d{4}$/.test("202")); // false
// 9
console.log(/^\w{2,4}$/.test("abc")); // true
// 10
console.log(/colou?r/.test("color")); // true
console.log(/colou?r/.test("colour")); // true
// 11
console.log(/[aeiou]/.test("xyz")); // false
console.log(/[aeiou]/.test("xay")); // true
// 12
console.log(/[^0-9]/.test("12a34")); // true (a raqam emas)
// 13
console.log(/^(ha|yoq)$/.test("ha")); // true
console.log(/^(ha|yoq)$/.test("balki")); // false
// 14
console.log("2024-01-15".replace(/-/g, "/")); // "2024/01/15"
// 15
console.log("2024-01-15".replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1"));
// "15/01/2024"
// 16
console.log("5 olma, 3 nok".match(/\d+/g)); // ["5","3"]
// 17
console.log(/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test("oqil@mail.uz")); // true
// 18
console.log(/^\+998\d{9}$/.test("+998901234567")); // true
console.log(/^\+998\d{9}$/.test("901234567")); // false
// 19
console.log("a, b; c d".split(/[,;\s]+/)); // ["a","b","c","d"]
// 20 — parol kuchi
function parolKuchi(parol) {
const xatolar = [];
if (parol.length < 8) xatolar.push("kamida 8 belgi");
if (!/[A-Z]/.test(parol)) xatolar.push("katta harf kerak");
if (!/[a-z]/.test(parol)) xatolar.push("kichik harf kerak");
if (!/\d/.test(parol)) xatolar.push("raqam kerak");
return xatolar.length === 0 ? "Kuchli" : xatolar;
}
console.log(parolKuchi("abc")); // ["kamida 8 belgi","katta harf kerak","raqam kerak"]
console.log(parolKuchi("Abc12345")); // "Kuchli"
✅ 5-qism to'liq yakuni (1 + 2 bo'lim)¶
5-qismni tugatding — endi JS'ni chuqur bilasan:
1-bo'lim (OOP yadrosi): Scope · Closures · Hoisting · this · Prototypes · Classes
2-bo'lim (zamonaviy vositalar): ES6+ (??, Set, Map) · Modullar (import/export) · Error handling (custom errors) · Regex
Bu darajada sen:
- Closure va thisni tushunasan (junior'ni middle'dan ajratadigan bilim)
- Class hierarchy va polimorfizm yozasan
- Kodni modullarga bo'lasan (real loyiha strukturasi)
- Xatolarni professional boshqarasan
- Regex bilan validatsiya/qidirish qilasan
Keyingi qadam (6-qism) — EXPERT¶
Oxirgi qism. Bu yerda "yaxshi dasturchi"ni "expert"dan ajratadigan mavzular:
- Functional Programming — pure functions, immutability, composition, currying
- Iterators & Generators — function*, yield, lazy evaluation; Symbols
- Proxy & Reflect — obyekt xatti-harakatini ushlab qolish (Vue 3 reaktivligi shu ustiga qurilgan!)
- Performance & Memory — debounce/throttle, memoization, memory leaks
- Design Patterns — Singleton, Factory, Observer, Module (real arxitektura)
- Bundlers & Build Tools — Vite, npm, tree-shaking (konseptual)
- TypeScript'ga ko'prik — JS'dan keyingi tabiiy qadam
Maslahat: 6-qismga o'tishdan oldin 22-modul #20 (validatsiya tizimi) va 23-modul #20 (parol kuchi)ni birlashtirib, to'liq forma validatsiya moduli yoz — custom error + regex + class birga. Bu — real loyihada ishlatadigan kod.
📚 README · ← 5-qism (1-bo'lim) · Keyingi: 6-qism (1-bo'lim) — Expert →