String - teksty

W JavaScript tak samo jak w innych językach możemy operować nie tylko na liczbach, ale także na tekstach. Tak zwane stringi w JavaScript możemy tworzyć na kilka sposobów:

const text = "Ala ma kota, a kot ma Ale."; //podwójne cudzysłowy

//lub

const text = 'Ala ma kota'; //pojedyncze apostrofy

Kiedy którego używać? W zasadzie wybór zależy od naszych preferencji, chociaż zdarzają się przypadki, że dany zapis może być ciut wygodniejszy od swojego brata:

//dzięki temu że zacząłem string od pojedynczych apostrofów
//bez problemu pisałem w środku cudzysłowy
const img = '<div class="element" data-text="test">';

//no to w drugą stronę
const txt = "It's a big year";

//ale w sumie nie ma to aż takiego znaczenia, bo zawsze możemy użyć znaku ucieczki
const img = "<div class=\"element\" data-text=\"test\">";
const txt = 'It\'s a big year';

Od 2015 roku stringi możemy też tworzyć za pomocą tak zwanych template string używając przy tym backticków:

const text = `Ala ma kota`;

Ich główną przewagą nad klasycznymi braćmi jest to, że unikamy tutaj problemów z cudzysłowami i apostrofami wewnątrz tekstu (ale już pisząc w ich wnętrzu backticki musimy stosowac znak ucieczki), ale przede wszystkim bez problemu możemy tutaj pisać teksty na kilka linii, oraz o wiele łatwiej możemy wstawiać do tekstu zmienne. Ale to za chwilę...

Teksty na wiele linii

Domyślnie klasyczne stringi tworzone za pomocą apostrofów lub cudzysłowów mogą być pisane tylko w jednej linii. Tworząc wieloliniowe teksty możemy zastosować kilka technik.

Wstawianie zmiennych do tekstu

Do wnętrza tekstu zmienne możemy wstawić na kilka sposobów. Dwa najpopularniejsze to dodawanie do stringa zmiennej oraz w przypadku template strings użycie tak zwanej interpolacji:

Template strings wydaje się fantastyczną sprawą. Pamiętaj tylko, że przy pisaniu takiego kodu trzeba mieć na uwadze to, że nie wszystkie przeglądarki obsługują tą składnię i w razie potrzeby przydało by się konwertować taki kod na starszy zapis.

Dokładniej temat template strings omówimy w jednym z kolejnych rozdziałów.

Długość tekstu

Aby odczytać długość naszego tekstu posłużymy się właściwością length.

Przy pracy z normalnymi tekstami, właściwość length zwróci wynik jak należy.

Pobieranie znaku na danej pozycji

Do pobrania w tekście znaku na danej pozycji możemy zastosować dwa podejścia. Jedno z nich to użycie funkcji charAt(). Drugie - to odwoływanie się do liter tekstu jak do elementów tablicy - poprzez kwadratowe nawiasy. Zasady są te same co przy tablicach. Pierwsza litera ma index 0, a ostatnia text.length-1

Typy proste (w tym String) nie są mutowalne, stąd nie możemy w nich bezpośrednio podmieniać liter jak pokazano poniżej:

Żeby móc podmienić literę w tekście, musimy wykorzystać dowolny sposób, który zwróci nam nowy tekst. Może to być zastosowanie replace(), substring(), czy innych opisanych na stackoverflow. Poniżej przykładowy sposób korzystający z tablicy:

Funkcje toUpperCase() i toLowerCase()

Funkcje toUpperCase() i toLowerCase() służą odpowiednio do zamieniania tekstu na duże i małe litery.

Funkcje indexOf() i lastIndexOf()

Funkcja indexOf zwraca pozycję szukanego fragmentu w tekście (ale także w tablicy, bo funkcja ta dostępna jest dla stringów i tablic). Wynik -1 oznacza, że szukanego fragmentu nie znaleziono:

Podobne działanie ma funkcja lastIndexOf, podaje ona jednak numer ostatniego wystąpienia podtekstu:

W nowym Javascript istnieje też funkcja includes(str), która także służy do wyszukiwania fragmentów tekstu. Różnica przy jej użyciu jest taka, że zamiast pozycji szukanego ciągu zwraca true/false:

Funkcje startsWith() i endsWith()

Funkcje startsWith() i endsWith() służą do sprawdzenia czy dany tekst zaczyna się i kończy od wskazanego fragmentu:

Funkcja substring()

Funkcja substring(start, stop) ma bardzo podobne działanie co powyższa. Różnicą jest drugi parametr, który zamiast długości wyznacza miejsce końca pobieranego kawałka. Jeżeli drugi parametr nie zostanie podany, wtedy kawałek będzie pobierany do końca tekstu. Jeżeli zostaną podane oba parametry, ale drugi będzie mniejszy od pierwszego, wtedy automatycznie zostaną one zamienione miejscami.

Funkcja slice()

Tekst jest uporządkowanym ciągiem znaków. Tak samo jak w przypadku tablic, tak i w przypadku zmiennych tekstowych możemy skorzystać z funkcji slice(start, stop), która zwraca nam kawałek tekstu. Jej działanie jest praktycznie identyczne do działania funkcji substring(), jednak występują małe różnice. Jeżeli drugi argument będzie mniejszy od pierwszego, wtedy w przeciwieństwie do substring() argumenty nie zostaną zamienione miejscami.

Funkcja split()

Funkcja split(znak, długość) zwraca tablicę, która składa się z podzielonych fragmentów tekstu. Miejsce podziału jest podawane w parametrze znak, a maksymalna ilość zwracanych elementów w parametrze długość:

Funkcja replace()

Funkcja replace(ciag_szukany, zamieniony) zwraca nowy tekst, w którym został zamieniony szukany ciąg znaków na nowy tekst.

Domyślnie funkcja replace() wyszukuje i zamienia tylko pierwsze wystąpienie szukanego ciągu:

Aby zostały zamienione wszystkie wystąpienia szukanego ciągu, musimy zastosować wyrażenie regularne.

W EcmaScript 2021 dodano też dodatkową funkcję replaceAll(), która służy do zamiany wszystkich znalezionych fragmentów tekstu:

Funkcja repeat()

Aby powtórzyć tekst możemy posłużyć się funkcją repeat(count). Parametr count określa liczbę powtórzeń tekstu - od 0 do +nieskończoności:

Podobny efekt możemy też uzyskać za pomocą klasycznych pętli:

Poruszanie się po tekście

Teksty i tablice w Javascript mają dużo wspólnych cech. Podobnie pobieramy tutaj długość danych elementów (length), podobnie odwołujemy się do danych składowych (przez indeks), a i wiele funkcji jest identyczna (slice(), indexOf(), includes() itp).

Podobnie jak w przypadku tablic po tekstach także możemy iterować:

Dodatkową możliwością iteracji jest zamiana tekstu na tablicę i wykorzystanie jednej z funkcji tablicowych:

Długość raz jeszcze

Jak sobie powiedzieliśmy powyżej, do pobrania długości tekstu używamy właściwości length.

Sprawdźmy to na prostym przykładzie:

Co za dziwo?!! Żeby zrozumieć czemu tak się dzieje, odpalmy naszego DeLoreana i zróbmy mały powrót do przeszłości. Gdy zaczynałem tworzyć strony, normą było wpisywanie znaków za pomocą bocznej klawiatury. I tak dla przykładu jeżeli chcieliśmy wpisać literkę ą, trzymając klawisz ALT wpisywaliśmy na klawiaturze numerycznej 0177, co w kodzie HTML dawało nam znak ±, a na stronie już właściwą literkę. Zabawa taka wynikała z tego, że powszechnie stosowanym kodowaniem było wtedy ISO-8859-2. Stare czasy gdy wśród edytorów królował Pajączek i podobne twory, które ułatwiały takie konwersje.

Wraz z rozwojem HTML rozpowszechnił się standard kodowania UTF, który pozwala w dzisiejszych czasach pisać nam litery normalnie wpisując je na klawiaturze. Standard UTF charakteryzuje się tym, że każdej literze przypisany jest jakiś kod. Te wszystkie kody pogrupowane są w grupy. Większość przez nas używanych znaków znajduje się w podstawowej przestrzeni (Basic Multilingual Plane) i posiada kody składające się z 4 heksadecymalnych znaków. Tablic z kodami w necie znajdziesz setki (wystarczy wpisać UTF char code) (1, 2).

W Javascript wszystkie stringi są kodowane za pomocą UTF-16. Litery w tekście możemy zapisać pisząc je na klawiaturze, ale też za pomocą odpowiadającego danemu znaku kodu UTF wpisując go na 3 różne sposoby:

Niestety wraz z rozwojem UTF, adaptacją coraz większej liczby języków a i wdrażaniem coraz wymyślniejszych znaków - pojawiły się takie, które nie mieszczą się w podstawowej powierzchni kodów (np. popularne w ostatnich czasach Emoji), a ich kod przekracza 4 cyfry.

Każda taka ikonka może być opisana za pomocą swojego oryginalnego kodu, ale też za pomocą 2 4-znakowych kodów, które postawione obok siebie tworzą daną ikonkę (tak zwane surogatki).

Sprawa jeszcze bardziej się gmatwa, jeżeli popatrzymy na emoji, które same w sobie składają się w kilku innych emoji:

Jak wstawisz sobie tą pierwszą ikonkę do edytora, spróbuj ją skasować za pomocą backspace.

Niestety idealnego 100% rozwiązania takich sytuacji nie ma. Na stackoverflow podają, by taki string zamienić na tablicę i pobierać jej długość. Ale i ta opcja nie zawsze zadziała.

Jednym z bardziej popularnych krojów używanych przez wielu programistów jest FiraCode, która zamienia niektóre znaki na odpowiednie ikony. Zasada działania jest podobna do powyższej. Gdy wpiszemy obok siebie jakieś znaki !==, zostaną one zamienione na odpowiedni znak zastępczy.

Bardzo ciekawy artykuł na te tematy znajdziesz tutaj i tutaj.

Last updated