JavaScript-da matnli maâlumotlar satrlar sifatida saqlanadi. Bitta belgi uchun alohida tip yoâq.
Satrlarning ichki formati har doim UTF-16, u sahifa kodlashiga bogâliq emas.
Qoâshtirnoqlar
Qoâshtirnoq turlarini eslaymiz.
Satrlar bitta qoâshtirnoq, qoâsh qoâshtirnoq yoki teskari qoâshtirnoq ichiga olinishi mumkin:
let single = "bitta qo'shtirnoq";
let double = "qo'sh qo'shtirnoq";
let backticks = `teskari qo'shtirnoqlar`;
Bitta va qoâsh qoâshtirnoqlar aslida bir xil. Teskari qoâshtirnoqlar esa bizga har qanday ifodani ${â¦} ichiga oârab satrga kiritish imkonini beradi:
function sum(a, b) {
return a + b;
}
alert(`1 + 2 = ${sum(1, 2)}.`); // 1 + 2 = 3.
Teskari qoâshtirnoqlarni ishlatishning yana bir afzalligi â ular satrning bir nechta qatorga choâzilishiga imkon beradi:
let guestList = `Mehmonlar:
* John
* Pete
* Mary
`;
alert(guestList); // mehmonlar ro'yxati, bir nechta qator
Tabiiy koârinadi, toâgârimi? Lekin bitta yoki qoâsh qoâshtirnoqlar bunday ishlamaydi.
Agar ularni ishlatib, bir nechta qatordan foydalanishga harakat qilsak, xato boâladi:
let guestList = "Mehmonlar: // Xato: Unexpected token ILLEGAL
* John";
Bitta va qoâsh qoâshtirnoqlar tilning yaratilishi qadimgi davrlaridan keladi, oâsha paytda koâp qatorli satrlar ehtiyoji hisobga olinmagan edi. Teskari qoâshtirnoqlar ancha keyinroq paydo boâlgan va shuning uchun koâproq imkoniyatlarga ega.
Teskari qoâshtirnoqlar shuningdek birinchi teskari qoâshtirnoqdan oldin âshablon funksiyasiniâ belgilashga imkon beradi. Sintaksis: func`string`. func funksiyasi avtomatik ravishda chaqiriladi, satr va kiritilgan ifodalarni oladi va ularni qayta ishlashi mumkin. Bu xususiyat âteglangan shablonlarâ deb ataladi, u kamdan-kam uchraydi, lekin bu haqda MDN da oâqishingiz mumkin: Template literals.
Maxsus belgilar
Bitta va qoâsh qoâshtirnoqlar bilan ham koâp qatorli satrlarni âyangi qator belgisiâ deb ataladigan \n yordamida yaratish mumkin, bu qator uzilishini bildiradi:
let guestList = "Mehmonlar:\n * John\n * Pete\n * Mary";
alert(guestList); // ko'p qatorli mehmonlar ro'yxati, yuqoridagi bilan bir xil
Oddiy misolda, bu ikki qator teng, shunchaki boshqacha yozilgan:
let str1 = "Salom\nDunyo"; // "yangi qator belgisi" yordamida ikki qator
// teskari qo'shtirnoq va oddiy yangi qator yordamida ikki qator
let str2 = `Salom
Dunyo`;
alert(str1 == str2); // true
Boshqa, kamroq uchraydigan maxsus belgilar ham bor:
| Belgi | Tavsif |
|---|---|
\n |
Yangi qator |
\r |
Windows matn fayllarida ikkita belgining kombinatsiyasi \r\n yangi uzilishni ifodalaydi, Windows boâlmagan OS da esa shunchaki \n. Bu tarixiy sabablarga koâra, koâpchilik Windows dasturlari ham \n ni tushunadi. |
\', \", \` |
Qoâshtirnoqlar |
\\ |
Teskari chiziq |
\t |
Tab |
\b, \f, \v |
Orqaga qaytarish, Shakl olib berish, Vertikal Tab â toâliqlik uchun eslatilgan, eski zamonlardan kelgan, hozir ishlatilmaydi (ularni hozir unutishingiz mumkin). |
Koârib turganingizdek, barcha maxsus belgilar teskari chiziq belgisi \ bilan boshlanadi. U âqochish belgisiâ deb ham ataladi.
U shunchalik maxsus boâlgani uchun, agar satr ichida haqiqiy teskari chiziq \ koârsatishimiz kerak boâlsa, uni ikki marta yozishimiz kerak:
alert(`Teskari chiziq: \\`); // Teskari chiziq: \
âQochganâ qoâshtirnoqlar \', \", \` bir xil qoâshtirnoqli satrga qoâshtirnoq kiritish uchun ishlatiladi.
Masalan:
alert("Men'm Walrus!"); // Men'm Walrus!
Koârib turganingizdek, ichki qoâshtirnoqdan oldin teskari chiziq \' qoâyishimiz kerak, aks holda u satr oxirini bildiradi.
Albatta, faqat oârab turgan qoâshtirnoqlar bilan bir xil qoâshtirnoqlarni qochirish kerak. Shuning uchun yanada nafis yechim sifatida biz qoâsh qoâshtirnoq yoki teskari qoâshtirnoqga oâtishimiz mumkin:
alert("Men'm Walrus!"); // Men'm Walrus!
Bu maxsus belgilardan tashqari, Unicode kodlari uchun maxsus notation \u⦠ham bor, u kamdan-kam ishlatiladi va Unicode haqidagi ixtiyoriy bobda yoritilgan.
Satr uzunligi
length xossasi satr uzunligiga ega:
alert(`Men\n`.length); // 3
Eâtibor bering, \n bitta âmaxsusâ belgi, shuning uchun uzunlik haqiqatan ham 3.
length- bu xossaBaâzi boshqa tillar tajribasiga ega odamlar baâzanstr.lengthoârnigastr.length() chaqirishda xato qiladi. Bu ishlamaydi.
Eâtibor bering, str.length raqamli xossa, funksiya emas. Undan keyin qavs qoâyish shart emas. .length() emas, balki .length.
Belgilarga kirish
pos pozitsiyasidagi belgini olish uchun kvadrat qavslar [pos] ishlatiladi yoki str.at(pos) usulini chaqiriladi. Birinchi belgi nol pozitsiyasidan boshlanadi:
let str = `Salom`;
// birinchi belgi
alert( str[0] ); // S
alert( str.at(0) ); // S
// oxirgi belgi
alert( str[str.length - 1] ); // m
alert( str.at(-1) );
Koârib turganingizdek, .at(pos) usuli salbiy pozitsiyaga imkon berishning afzalligiga ega. Agar pos salbiy boâlsa, u satr oxiridan hisoblanadi.
Demak .at(-1) oxirgi belgini, .at(-2) undan oldingi belgini va hokazo anglatadi.
Kvadrat qavslar salbiy indekslar uchun har doim undefined qaytaradi, masalan:
let str = `Salom`;
alert(str[-2]); // undefined
alert(str.at(-2)); // l
Shuningdek, for..of yordamida belgilar boâylab iteratsiya qilishimiz mumkin:
for (let char of "Salom") {
alert(char); // S,a,l,o,m (char "S" bo'ladi, keyin "a", keyin "l" va hokazo)
}
Satrlar oâzgarmas
JavaScript-da satrlarni oâzgartirib boâlmaydi. Belgini oâzgartirish imkonsiz.
Buni ishlamasligini koârsatish uchun sinab koâraylik:
let str = "Salom";
str[0] = "s"; // xato
alert(str[0]); // ishlamaydi
Odatiy yechim â butunlay yangi satr yaratish va uni eski oârniga str ga tayinlashdir.
Masalan:
let str = "Salom";
str = "s" + str[1]; // satrni almashtirish
alert(str); // salom
Keyingi boâlimlarda bunga koâproq misollar koâramiz.
Registrni oâzgartirish
toLowerCase() va toUpperCase() usullari registrni oâzgartiradi:
alert("Interface".toUpperCase()); // INTERFACE
alert("Interface".toLowerCase()); // interface
Yoki agar bitta belgini kichik harfga oâtkazmoqchi boâlsak:
alert("Interface"[0].toLowerCase()); // 'i'
Substring qidirish
Satr ichida substring qidirish uchun bir nechta usul mavjud.
str.indexOf
Birinchi usul str.indexOf(substr, pos).
U berilgan pos pozitsiyasidan boshlab str da substr ni qidiradi va mos kelish topilgan pozitsiyani yoki hech narsa topilmasa -1 ni qaytaradi.
Masalan:
let str = "Widget with id";
alert(str.indexOf("Widget")); // 0, chunki 'Widget' boshida topilgan
alert(str.indexOf("widget")); // -1, topilmadi, qidiruv registrga sezgir
alert(str.indexOf("id")); // 1, "id" 1-pozitsiyada topilgan (..idget with id)
Ixtiyoriy ikkinchi parametr bizga berilgan pozitsiyadan qidirishni boshlash imkonini beradi.
Masalan, "id" ning birinchi uchrayishi 1-pozitsiyada. Keyingi uchrayishni qidirish uchun 2-pozitsiyadan qidirishni boshlaylik:
let str = "Widget with id";
alert(str.indexOf("id", 2)); // 12
Agar bizni barcha uchrayishlar qiziqtirsa, indexOf ni tsiklda ishga tushirishimiz mumkin. Har bir yangi chaqiruv oldingi mos kelishdan keyingi pozitsiya bilan amalga oshiriladi:
let str = "As sly as a fox, as strong as an ox";
let target = "as"; // buni qidiraylik
let pos = 0;
while (true) {
let foundPos = str.indexOf(target, pos);
if (foundPos == -1) break;
alert(`${foundPos} da topildi`);
pos = foundPos + 1; // keyingi pozitsiyadan qidirishni davom ettirish
}
Xuddi shu algoritm qisqaroq yozilishi mumkin:
let str = "As sly as a fox, as strong as an ox";
let target = "as";
let pos = -1;
while ((pos = str.indexOf(target, pos + 1)) != -1) {
alert( pos );
}
str.lastIndexOf(substr, position)Satrning oxiridan boshigacha qidiradigan oâxshash str.lastIndexOf(substr, position) usuli ham bor.
U uchrayishlarni teskari tartibda roâyxatlaydi.
if testida indexOf bilan biroz noqulaylik bor. Biz uni if ga quyidagicha qoâya olmaymiz:
let str = "Widget with id";
if (str.indexOf("Widget")) {
alert("Topdik"); // ishlamaydi!
}
Yuqoridagi misoldagi alert koârsatilmaydi, chunki str.indexOf("Widget") 0 ni qaytaradi (yaâni boshlovchi pozitsiyada mos kelishni topganini anglatadi). Toâgâri, lekin if 0 ni false deb hisoblay
di.
Shuning uchun biz aslida -1 ni tekshirishimiz kerak:
let str = "Widget with id";
if (str.indexOf("Widget") != -1) {
alert("Topdik"); // endi ishlaydi!
}
includes, startsWith, endsWith
Zamonaviyroq str.includes(substr, pos) usuli str da substr mavjudligiga qarab true/false qaytaradi.
Agar mos kelishni tekshirish kerak boâlsa, lekin uning pozitsiyasi kerak boâlmasa, bu toâgâri tanlovdir:
alert("Widget with id".includes("Widget")); // true
alert("Salom".includes("Xayr")); // false
str.includes ning ixtiyoriy ikkinchi argumenti qidirishni boshlash pozitsiyasidir:
alert("Widget".includes("id")); // true
alert("Widget".includes("id", 3)); // false, 3-pozitsiyadan "id" yo'q
str.startsWith va str.endsWith usullari aynan ular aytganini qiladi:
alert("Widget".startsWith("Wid")); // true, "Widget" "Wid" bilan boshlanadi
alert("Widget".endsWith("get")); // true, "Widget" "get" bilan tugaydi
Substring olish
JavaScript-da substring olish uchun 3 ta usul mavjud: substring, substr va slice.
str.slice(start [, end])-
startdanendgacha (lekinendni oâz ichiga olmasdan) satr qismini qaytaradi.Masalan:
let str = "stringify"; alert( str.slice(0, 5) ); // 'strin', 0 dan 5 gacha substring (5 ni o'z ichiga olmaydi) alert( str.slice(0, 1) ); // 's', 0 dan 1 gacha, lekin 1 ni o'z ichiga olmaydi, faqat 0 dagi belgiAgar ikkinchi argument boâlmasa,
slicesatr oxirigacha boradi:let str = "stringify"; alert( str.slice(2) ); // 'ringify', 2-pozitsiyadan oxirigachastart/enduchun salbiy qiymatlar ham mumkin. Ular pozitsiya satr oxiridan hisoblanishini anglatadi:let str = "stringify"; // o'ngdan 4-pozitsiyadan boshlab, o'ngdan 1-pozitsiyada tugat alert( str.slice(-4, -1) ); // 'gif' str.substring(start [, end])-
startvaendorasidagi satr qismini qaytaradi (endni oâz ichiga olmaydi).Bu deyarli
slicebilan bir xil, lekinstartningenddan katta boâlishiga imkon beradi (bu holda u shunchakistartvaendqiymatlarini almashtiradi).Masalan:
let str = "stringify"; // bular substring uchun bir xil alert( str.substring(2, 6) ); // "ring" alert( str.substring(6, 2) ); // "ring" // ...lekin slice uchun emas: alert( str.slice(2, 6) ); // "ring" (bir xil) alert( str.slice(6, 2) ); // "" (bo'sh satr)Salbiy argumentlar (slice dan farqli oâlaroq) qoâllab-quvvatlanmaydi, ular
0deb qaraladi. str.substr(start [, length])-
startdan boshlab, berilganlengthbilan satr qismini qaytaradi.Oldingi usullardan farqli oâlaroq, bu tugash pozitsiyasi oârniga
lengthni koârsatish imkonini beradi:let str = "stringify"; alert( str.substr(2, 4) ); // 'ring', 2-pozitsiyadan 4 ta belgi olBirinchi argument oxirdan hisoblash uchun salbiy boâlishi mumkin:
let str = "stringify"; alert( str.substr(-4, 2) ); // 'gi', 4-pozitsiyadan 2 ta belgi olBu usul til spetsifikatsiyasining Ilova B da joylashgan. Bu faqat brauzer-joylashtirilgan JavaScript dvigatellari uni qoâllab-quvvatlashi kerakligini anglatadi va uni ishlatish tavsiya etilmaydi. Amalda u hamma joyda qoâllab-quvvatlanadi.
Har qanday chalkashlikdan qochish uchun bu usullarni takrorlaylik:
| usul | tanlaydi⦠| salbiylar |
|---|---|---|
slice(start, end) |
start dan end gacha (end ni oâz ichiga olmaydi) |
salbiylarga ruxsat beradi |
substring(start, end) |
start va end orasida (end ni oâz ichiga olmaydi) |
salbiy qiymatlar 0 ni anglatadi |
substr(start, length) |
start dan length ta belgi ol |
salbiy start ga ruxsat beradi |
Ularning barchasi ishni bajara oladi. Rasmiy ravishda substr ning kichik kamchiligi bor: u JavaScript spetsifikatsiyasining asosiy qismida emas, balki brauzer-only xususiyatlarini qamrab oluvchi Ilova B da tasvirlangan va asosan tarixiy sabablarga koâra mavjud. Shuning uchun brauzer boâlmagan muhitlar uni qoâllab-quvvatlamasligi mumkin. Lekin amalda u hamma joyda ishlaydi.
Qolgan ikki variantdan slice biroz moslashuvchanroq, u salbiy argumentlarga imkon beradi va yozish qisqaroq.
Shuning uchun amaliy foydalanish uchun faqat slice ni yodlab qolish kifoya.
Satrlarni solishtirish
Taqqoslashlar bobidan maâlumki, satrlar alifbo tartibida belgi-belgi solishtiriladi.
Garchi, baâzi gâalatiliklar bor.
-
Kichik harf har doim katta harfdan kattaroq:
alert("a" > "Z"); // true -
Diakritik belgili harflar âtartibdan tashqariâ:
alert("Ãsterreich" > "Zealand"); // trueBu mamlakat nomlarini saralasak gâalati natijalarga olib kelishi mumkin. Odatda odamlar
Zealandning roâyxatdaÃsterreichdan keyin kelishini kutadilar.
Nima sodir boâlishini tushunish uchun JavaScript-da satrlar UTF-16 yordamida kodlanishini bilishimiz kerak. Yaâni: har bir belgining mos raqamli kodi bor.
Kod uchun belgini va teskarisini olish imkonini beradigan maxsus usullar mavjud:
str.codePointAt(pos)-
pospozitsiyasidagi belgi uchun kodni ifodalovchi oânli raqam qaytaradi:// turli registrli harflar turli kodlarga ega alert( "Z".codePointAt(0) ); // 90 alert( "z".codePointAt(0) ); // 122 alert( "z".codePointAt(0).toString(16) ); // 7a (agar hex qiymat kerak bo'lsa) String.fromCodePoint(code)-
Raqamli
codeboâyicha belgi yaratadialert( String.fromCodePoint(90) ); // Z alert( String.fromCodePoint(0x5a) ); // Z (argument sifatida hex qiymatdan ham foydalanish mumkin)
Endi 65..220 kodli belgilarni (lotin alifbosi va biroz qoâshimcha) koârib, ulardan satr yasaylik:
let str = "";
for (let i = 65; i <= 220; i++) {
str += String.fromCodePoint(i);
}
alert(str);
// Chiqish:
// ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
// ¡¢£¤¥¦§¨©ª«¬Â®¯°±²³´µ¶·¸¹º»¼½¾¿ÃÃÃÃÃÃ
ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ
Koârdingizmi? Avval katta harflar, keyin bir nechta maxsus belgilar, keyin kichik harflar va chiqish oxirida Ã.
Endi a > Z nima uchun ekanligi aniq.
Belgilar raqamli kod boâyicha solishtiriladi. Kattaroq kod belgining kattaroq ekanligini anglatadi. a (97) ning kodi Z (90) ning kodidan kattaroq.
- Barcha kichik harflar katta harflardan keyin keladi, chunki ularning kodlari kattaroq.
Ãkabi baâzi harflar asosiy alifbodan alohida turadi. Bu yerda uning kodiadanzgacha boâlgan har qanday narsadan kattaroq.
To'g'ri solishtirishlar
Satrlarni solishtirish uchun âtoâgâriâ algoritm koâringanidan murakkabroq, chunki turli tillar uchun alifbolar turlicha.
Shuning uchun brauzer qaysi tilda solishtirish kerakligini bilishi kerak.
Yaxshiyamki, zamonaviy brauzerlar ECMA-402 xalqarolashtirish standartini qoâllab-quvvatlaydi.
U turli tillarda satrlarni ularning qoidalariga koâra solishtiradigan maxsus usulni taqdim etadi.
str.localeCompare(str2) chaqiruvi til qoidalariga koâra str str2 dan kichik, teng yoki katta ekanligini koârsatadigan butun sonni qaytaradi:
- Agar
strstr2dan kichik boâlsa, salbiy raqam qaytaradi. - Agar
strstr2dan katta boâlsa, musbat raqam qaytaradi. - Agar ular ekvivalent boâlsa,
0qaytaradi.
Masalan:
alert("Ãsterreich".localeCompare("Zealand")); // -1
Bu usul aslida hujjatlarda koârsatilgan ikkita qoâshimcha argumentga ega, bu tilni belgilash (sukut boâyicha muhitdan olinadi, harflar tartibi tilga bogâliq) va registr sezgirlik yoki "a" va "á" bir xil deb qaralishi kerakmi kabi qoâshimcha qoidalarni oârnatish imkonini beradi.
Xulosa
- 3 turdagi qoâshtirnoq bor. Teskari qoâshtirnoqlar satrning bir nechta qatorga choâzilishi va ifodalarni
${â¦}kiritish imkonini beradi. - Biz yangi qator
\nkabi maxsus belgilardan foydalanishimiz mumkin. - Belgi olish uchun:
[]yokiatusulini ishlatamiz. - Substring olish uchun:
sliceyokisubstringdan foydalanamiz. - Satrni kichik/katta harfga oâtkazish uchun:
toLowerCase/toUpperCasedan foydalanamiz. - Substring qidirish uchun:
indexOfdan yoki oddiy tekshiruvlar uchunincludes/startsWith/endsWithdan foydalanamiz. - Satrlarni tilga koâra solishtirish uchun:
localeComparedan foydalanamiz, aks holda ular belgi kodlari boâyicha solishtiriladi.
Satrlarda bir nechta boshqa foydali usullar ham bor:
str.trim()â satrning boshi va oxiridagi boâshliqlarni olib tashlaydi (âkesadiâ).str.repeat(n)â satrninmarta takrorlaydi.- â¦va koâproq narsalarni qoâllanmada topish mumkin.
Satrlar muntazam ifodalar bilan qidirish/almashtirish uchun usullar ham bor. Lekin bu katta mavzu, shuning uchun u alohida oâquv qoâllanma boâlimida Muntazam ifodalar tushuntirilgan.
Shuningdek, hozir satrlar Unicode kodlashiga asoslanganligini va shuning uchun solishtirishlar bilan muammolar borligini bilish muhim. Unicode haqida koâproq maâlumot Unicode, Satr ichki tuzilishi bobida.
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â¦)