Jeśli kiedykolwiek korzystaliście z narzędzi takich jak Mustache lub Handlebars, zapewne z bananem na twarzy przyjmiecie wiadomość, że ES6 umożliwia używanie wyrażeń wewnątrz stringów. To tylko jedna z kilku nowych możliwości stringów wprowadzonych w ECMAScript 6.
Interpolacja stringów
W JavaScript umieszczanie wartości zmiennych wewnątrz stringów nie jest zbyt wygodne. Zmusza do pilnowania cudzysłowów, plusików, spacji, znaków końca linii i kilku innych rzeczy. Powstały nawet całe biblioteki, których główną funkcjonalnością jest uproszczenie tego procederu. Na szczęście ECMAScript 6 rozwiązuje ten problem w bardzo prosty sposób. Weźmy przykładowy kod w ES5:
let a = 2;
let b = 3;
console.log("Dwa plus trzy to " + (a + b) + "."); //Dwa plus trzy to 5.
Identyczny rezultat osiągniemy w ES6 następującym kodem:
let a = 2;
let b = 3;
console.log(`Dwa plus trzy to ${a + b}.`); //Dwa plus trzy to 5.
Za całą magię w powyższym przykładzie odpowiadają znaki `
. Objęcie nimi stringa pozwala na umieszczenie w nim dowolnego wyrażenia. Wyrażenie wystarczy objąć w nawiasy klamrowe {}
i poprzedzić znakiem $
. Jest to tzw. interpolacja, znana z języków takich jak Pearl czy Python. Inny przykład wykorzystania interpolacji:
let circle = { radius: 5, name: "A" };
let message = `Pole koła ${circle.name} to ${Math.pow(circle.radius, 2) * Math.PI}.`;
console.log(message); //Pole koła A to 78.53981633974483.
Stringi wielowierszowe (multiline)
Interpolacja to nie jedyna możliwość jaką daje obejmowanie stringów znakami `
zamiast '
czy "
. Kolejnym udogodnieniem jest możliwość prostego zapisu stringa w wielu wierszach. Żeby to zobrazować rozwiniemy pierwszy przykład w ES5:
let a = 2;
let b = 3;
console.log("Dwa plus trzy to " + (a + b) + ",\ndwa razy trzy to " + a * b + ".");
Kod ten poskutkuje wypisanie w konsoli następujących dwóch linijek:
Dwa plus trzy to 5,
dwa razy trzy to 6.
W ES6, korzystając ze znaków `
możemy osiągnąć to samo, a przy okazji skrócić kod i zwiększyć jego czytleność:
let a = 2;
let b = 3;
console.log(`Dwa plus trzy to ${a + b},
dwa razy trzy to ${a * b}.`);
Metody stringowe
ECMAScript 6 wprowadza także wiele gotowych metod do obsługi stringów. Wartych odnotowania jest szczególnie kilka z nich:
- String.prototype.startsWith
- String.prototype.endsWith
- String.prototype.includes
- String.prototype.repeat
Omówmy je pokrótce:
String.prototype.startsWith
Sprawdza, czy string rozpoczyna się od znaków z innego stringa zwracając odpowiednio true
lub false
. Może też przyjąć drugi parametr określający od którego znaku ma zacząć sprawdzanie. Przykład:
let str = 'Śpieszmy się uczyć ES6, tak szybko nadchodzi.';
console.log(str.startsWith('Ś')); // true
console.log(str.startsWith('Śpieszmy się ')); // true
console.log(str.startsWith('ES6')); // false
console.log(str.startsWith('ES6', 19)); // true
String.prototype.endsWith
Jak można się domyślić, działa to analogicznie do powyższego. Sprawdza, czy string kończy się znakami z innego stringa zwracając odpowiednio true
lub false
. Może też przyjąć drugi parametr sprawiający, że wyszukujemy w stringu, jakim ten by się stał, gdyby został ograniczony do tylu znaków ile podaje parametr. Przykład:
let str = 'Żenujące parafrazy klasyków zawsze w cenie.';
console.log(str.endsWith('nie.')); // true
console.log(str.endsWith(' cenie.')); // true
console.log(str.endsWith('Żenujące')); // false
console.log(str.endsWith('klasyków', 27)); // true
String.prototype.includes
Sprawdza, czy string zawiera w sobie innego stringa zwracając odpowiednio true
lub false
. Może też przyjąć drugi parametr określający od którego znaku ma zacząć sprawdzanie. Przykład:
let str = 'Od długiego siedzenia przed kompem mózg się lasuje.';
console.log(str.includes('długiego')); // true
console.log(str.includes(' ')); // true
console.log(str.includes('musk')); // false
console.log(str.includes('Od', 10)); // false
String.prototype.repeat
Zwraca string zbudowany z tego samego stringa powtórzonego zadaną ilosć razy. Przykład:
let str = 'abcd';
str.repeat(-1); // RangeError
str.repeat(0); // ''
str.repeat(1); // 'abcd'
str.repeat(2); // 'abcdabcd'
str.repeat(3.5); // 'abcdabcdabcd' (konwertuje parametr na integer)