Template literallarni chuqur o'rganish: ifodalar interpolatsiyasi, multiline matnlar, ichma-ich (nested) shablonlar hamda Tagged Templates va XSS himoyasi.
Chapter 9'da Template Literal bilan yuzaki tanishgan edik. Bu bobda uning barcha imkoniyatlarini — ko'p qatorli matn, ifodalar bilan ishlash va Tagged Templatesni chuqur o'rganamiz.
Template Literal — backtick (`) bilan yoziladigan, ichiga variable va ifodalarni to'g'ridan-to'g'ri joylashtirish imkonini beruvchi string turi.
script.jsJavaScriptlet name = "Ali";let age = 25;console.log(`Salom, men ${name}man va ${age} yoshdaman`);
${} ichiga nafaqat variable, balki istalgan JavaScript ifodasini yozish mumkin — matematik amal, function chaqiruvi, ternary operator va h.k.
script.jsJavaScriptlet price = 100;let quantity = 3;console.log(`Jami: ${price * quantity} so'm`);// "Jami: 300 so'm"
script.jsJavaScriptfunction getDiscount(price) {return price * 0.9;}let price = 500;console.log(`Chegirmali narx: ${getDiscount(price)} so'm`);// "Chegirmali narx: 450 so'm"
script.jsJavaScriptlet age = 20;console.log(`Siz ${age >= 18 ? "kattasiz" : "kichiksiz"}`);// "Siz kattasiz"
💡 Key Idea
${} ichida yozilgan har qanday kod avval hisoblanadi (evaluate qilinadi), keyin uning natijasi string ichiga qo'yiladi.
Oddiy string'larda ("...", '...') yangi qatorga o'tish uchun maxsus belgi (\n) kerak bo'lardi. Template literal esa buni to'g'ridan-to'g'ri qo'llab-quvvatlaydi.
script.jsJavaScript// Oddiy string bilan (noqulay)let text1 = "Birinchi qator\nIkkinchi qator\nUchinchi qator";// Template literal bilan (qulay)let text2 = `Birinchi qatorIkkinchi qatorUchinchi qator`;
script.jsJavaScriptlet user = { name: "Nodira", age: 22, city: "Farg'ona" };let html = `<div class="card"><h2>${user.name}</h2><p>Yosh: ${user.age}</p><p>Shahar: ${user.city}</p></div>`;console.log(html);
Bu naqsh — veb-dasturlashda HTML shablonlarni JavaScript orqali dinamik yaratishda juda ko'p ishlatiladi.
Template literal ichida yana template literal ishlatish mumkin — bu murakkab shartli mantiqni ifodalashda foydali.
script.jsJavaScriptlet cart = [{ name: "Laptop", price: 1200 }, { name: "Mouse", price: 20 }];let receipt = `Xarid ro'yxati:${cart.map(item => `- ${item.name}: ${item.price} so'm`).join("\n ")}`;console.log(receipt);
Ichki template literal (- ${item.name}: ${item.price} so'm) — har bir mahsulot uchun qator hosil qiladi, tashqi template literal esa ularni yig'ib, umumiy chekni tuzadi.
🔗 Connection
Bu misolda Chapter 14'da o'rgangan map() va Chapter 9'dagi join() birgalikda ishlatilmoqda — bu boblar orasidagi bog'liqlikni ko'rsatadi.
Tagged Template — template literal oldiga function nomini yozib, uni "belgilash" orqali, string qanday yig'ilishini to'liq nazorat qilish imkoniyati.
Chunki bu — kamdan-kam ishlatiladigan, "sehrli" ko'rinadigan sintaksis, va uning ichki ishlash mexanizmini tushunish uchun function qanday chaqirilishini alohida ko'rish kerak.
script.jsJavaScriptfunction myTag(strings, ...values) {console.log(strings); // string qismlar array'iconsole.log(values); // ${} ichidagi qiymatlar array'i}let name = "Ali";let age = 25;myTag`Salom, men ${name}man va ${age} yoshdaman`;
Natija:
code.textTEXTstrings = ["Salom, men ", "man va ", " yoshdaman"]values = ["Ali", 25]
Tagged template chaqirilganda, JavaScript template literal'ni ikkiga bo'lib beradi:
strings — ${}lar orasidagi oddiy matn qismlari (array shaklida).values — ${} ichidagi hisoblangan qiymatlar (alohida argumentlar sifatida, ...values orqali yig'iladi).code.textTEXT`Salom, men ${name}man va ${age} yoshdaman`│ │ │strings[0] strings[1] strings[2]values[0] values[1](name) (age)
script.jsJavaScriptfunction safeHTML(strings, ...values) {let result = "";strings.forEach((str, i) => {result += str;if (values[i] !== undefined) {// Har bir qiymatni "tozalab" qo'shishlet safeValue = String(values[i]).replace(/</g, "<").replace(/>/g, ">");result += safeValue;}});return result;}let userInput = "<script>alert('hack')</script>";console.log(safeHTML`Foydalanuvchi izohi: ${userInput}`);// "Foydalanuvchi izohi: <script>alert('hack')</script>"
Bu misol Tagged Template'ning haqiqiy foydasini ko'rsatadi: foydalanuvchidan kelgan xavfli HTML kodni avtomatik "tozalab", xavfsiz stringga aylantiradi. Bu — veb-xavfsizlikda XSS (Cross-Site Scripting) hujumlaridan himoyalanishning bir usuli.
🔥 Important
Tagged Template'lar kamdan-kam to'g'ridan-to'g'ri o'zingiz yozadigan narsa, lekin ular ko'plab mashhur kutubxonalarda (masalan, styled-components — React uchun CSS yozish kutubxonasi) ichki mexanizm sifatida ishlatiladi.
Task:
Ikkita variable (firstName, lastName) yordamida template literal orqali to'liq ismni chiqaring.
Required Concepts:
${firstName} ${lastName} dan foydalaning.Task:
Berilgan mahsulotlar array'idan (name, price propertylari bilan) template literal va map()/join() yordamida ro'yxat ko'rinishidagi matn hosil qiling — har bir mahsulot alohida qatorda bo'lsin.
Required Concepts:
map(), join()Task:
Oddiy Tagged Template function yozing — u ${} ichidagi barcha son qiymatlarni qalin (masalan, **qiymat** formatida) qilib ko'rsatsin, string qiymatlarni esa o'zgarishsiz qoldirsin.
Required Concepts:
typeofvaluesni aylanib chiqib, typeof value === "number" bo'lsa, uni **${value}** shaklida formatlang.script.jsJavaScriptfunction tag(strings, ...values) {return strings.length;}let result = tag`A${1}B${2}C`;console.log(result);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 3Why?
Template A${1}B${2}C — 3 ta matn qismidan iborat: "A", "B", "C". ${} ichidagi qiymatlar (1, 2) alohida values array'iga tushadi va strings array'iga kirmaydi. Umuman olganda, strings.length har doim values.length + 1ga teng bo'ladi.
Quyidagi kodda muammo bor:
script.jsJavaScriptlet name = "Ali";let age = 25;console.log("Salom, men ${name}man va ${age} yoshdaman");
Your Task:
${} ishlamayotganini tushuntiring.Yechim:
</details>script.jsJavaScriptconsole.log(`Salom, men ${name}man va ${age} yoshdaman`);
${} ichiga istalgan JavaScript ifodasi yozilishi mumkin.${} ichida function chaqirish, matematik amal, ternary — barchasi mumkin.strings va valuesni alohida-alohida qabul qiladi.script.jsJavaScriptlet name = "Ali";`Oddiy: ${name}`; // ifoda bilan`Ko'p qatorlimatn`; // multilinefunction tag(strings, ...values) {return strings.raw.join("");}tag`Salom ${name}!`; // tagged template
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: