Konwersja string #13
Konwersja string
Konwersja do typu string będzie zdarzała się niezwykle często. Do konwersji na typ string
możemy użyć funkcji String()
lub też metody toString()
, którą można wywołać na każdej zmiennej i obiekcie. Metoda toString()
bardzo często wywoływana jest przy wszelkich konwersjach niejawnych na przykład przy poleceniu console.log()
.
String()
Do funkcji String()
możemy przekazać każdą wartość:
console.log(String(42)); // '42'
console.log(String(NaN)); // 'NaN'
console.log(String(Infinity)); // 'Infinity'
console.log(String(null)); // 'null'
console.log(String(undefined)); // 'undefined'
console.log(String(true)); // 'true'
console.log(String(false)); // 'false'
Zawsze otrzymamy jakaś wartość w postaci łańcuchowej.
Funkcja String()
jest o tyle bezpieczna, że możemy tam wciąż przekazać null
i undefined
. Czego nie da się zrobić wywołując bezpośrednio funkcję toString()
.
console.log(42..toString()); // '42'
// console.log(null.toString()); // error
// console.log(undefined.toString()); // error
console.log(NaN.toString()); // 'false'
console.log(true.toString()); // 'false'
console.log(false.toString()); // 'false'
W przypadku null
i undefined
otrzymamy błąd. Dlatego zawsze bezpieczniej jest wywołać funkcję String()
.
Konwersja ze znakiem +
Bardzo popularnym sposobem konwersji na typ string
jest użycie znaku +
i dodanie pustego stringa do innej wartości. Jest to bardzo często spotykany sposób konwersji do typu string
.
console.log(42 + ''); // '42'
console.log(null + ''); // 'null'
console.log(undefined + ''); // 'undefined'
console.log(false + ''); // 'false'
console.log(true + ''); // 'false'
Gdy po jednej ze stron znaku +
stoi wartość typu string
nie zostanie wykonane działanie matematyczne, ale konkatenacja stringów. Oczywiście przed konkatenacją następuje konwersja wartości do typu string
, a potem połączenie wartości z pustym stringiem. W ten sposób możemy przekonwertować na
typ string
każdą wartość.
Przy typie number
możemy wpaść w pułapkę:
console.log(40 + '2'); // '402'
console.log(99 + '1'); // '991'
Jeżeli po której stronie operatora +
stoi string, zawsze nastąpi połączenie stringów. Nie wykonamy w ten sposób działania matematycznego. Trzeba uważać na taką pułapkę i mieć świadomość czy pracujemy na typie number
czy też na typie string
.
String na number
String na number
omawiany był już przy okazji konwersji typu number
:
console.log(Number('')) // 0
console.log(Number('42.5')) // 42.5
console.log(parseInt('42.5')) // 42.5
console.log(parseFloat('42.5')) // 42.5
console.log(Number('42.5xyz')) // NaN
console.log(parseInt('42.5xyz')) // 42
console.log(parseFloat('42.5xyz')) // 42.5
Do dyspozycji mamy znane nam już funkcje Number(), parseInt(), parseFloat()
. Zasada jest bardzo prosta, jeżeli używamy funkcji Number()
musimy dbać, aby literał typu string reprezentował liczbę.
Jeżeli używamy parseInt()
lub parseFloat()
literał nie musi dokładnie przedstawiać liczby, niepotrzebne znaki zostaną wycięte.
Każda liczba w typie string musi zostać zapisana z kropką nie przecinkiem. Wtedy jest to poprawna reprezentacja liczby w JavaScript.
String na boolean
Jeśli chodzi o konwersję wartości w typie string
na typ boolean
wiemy już, że pusty string to wartość false
, a każdy niepusty string to wartość true
.
console.log(Boolean('')); // false
console.log(Boolean('foo')); // true
Jeżeli będziemy operować takimi wartościami jak 'true'
oraz 'false'
zapisane jako string
console.log(Boolean('false')) // true
console.log(Boolean('true')) // true
nie będziemy mogli użyć wbudowanej funkcji Boolean()
do ich konwersji na typ boolean
.
Przy takiej konwersji zawsze otrzymamy wartość true
. Musimy zatem stworzyć własną implementację i porównać wartości:
const someValue = 'false';
const result = someValue === 'true';
console.log(result); // false
Wynikiem porównania w JavaScript jest zawsze jakaś wartość boolean
. Porównujemy czy zmienna value
jest napisem 'true'
jeżeli tak otrzymamy true
jako boolean
, jeżeli nie, otrzymamy false
. Tak w najprostszy sposób możemy dokonać konwersji literałów 'true'
oraz 'false'
na typ boolean
.
Przy tym zapisie, warto jeszcze mieć pewność, że porównywane łańcuchy mają tą samą wielkość liter. Dla bezpieczeństwa warto dołożyć wywołanie metody toUpperCase()
i być może obciąć puste znaki przez metodę trim()
.
Co warto zapamiętać
-
funkcja
String()
to doskonały sposób na konwersję do typustring
-
innym sposobem jest wywołanie metody
toString()
która jest zapewniona dla każdego typu -
dodanie pustego stringa do jakiejś wartości spowoduje konwersję na typ
string
-
na typ
number
konwertujemy stringi za pomocą funkcjiNumber(), parseInt() lub parseFloat()
-
stringowy zapis wartości
true
ifalse
możemy przekonwertować przez stworzenie własnej funkcji