Konwersja boolean #11
Konwersja boolean
W tym dziale będziemy omawiać konwersję na typ boolean
oraz konwersje wartości boolean
na inne typy jak string
i number
. Przyjrzymy się jawnym metodom konwersji jak na przykład funkcji Boolean()
, którą już trochę omawialiśmy.
Oprócz jawnej konwersji na typ często będziecie mieli do czynienia z niejawną konwersją. Dotyczy ona często instrukcji warunkowych, pętli, operatorach porównania i operatorach logicznych.
Wszystkie sposoby porównania także logicznego omówimy sobie jeszcze w oddzielnych działach. Teraz skupmy się na tym jak konwertować na typ boolean
i jak konwertować wartości tego typu do innych typów.
Wartości fałszywe i prawdziwe
Jednym z jawnych sposobów konwersji jest użycie funkcji Boolean()
. Do tej funkcji możemy wstawić dosłownie wszystko.
Niektóre wyniki jawnych konwersji mogą być łatwe do przewidzenia, niektóre jednak mogą wydawać się nam mało logiczne. Wszystko natomiast opiera się na wartościach fałszywych. Wartości fałszywe, są określone w specyfikacji, a także na stronie
MDM https://developer.mozilla.org/en-US/docs/Glossary/Falsy.
Jest to krótka i ściśle określona lista, pokazująca, która wartości po konwersji do typu boolean
, staną się wartościami false
.
Lista wartości fałszywych jest czymś, co powinniśmy zapamiętać, pracując w JavaScript:
console.log(Boolean(false));
console.log(Boolean(0));
console.log(Boolean(-0));
console.log(Boolean(0n));
console.log(Boolean(''));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(NaN));
Specyfikacja dokładnie określa, jaka wartość jest konwertowana na wartość false
. Są to wszystkie wartości puste, nic nie reprezentujące jak null
i undefined
, wszystkie liczby, które nie mają żadnej wartości jak zera i wartość NaN
, pusty string oraz oczywiście sama wartość false
.
Drugą rzeczą do zapamiętania jest to, że wszystko, co nie znajduje się na liście wartości fałszywych, konwertuje się do wartości true
. Jak się domyślacie listy z wartościami true
nie ma, ponieważ byłaby ona niesamowicie długa, a może nawet nieskończenie długa.
Podam tylko kilka ciekawych przypadków wartości true
, które mogą wydawać się false
:
console.log(Boolean('false')); // true
console.log(Boolean('0')); // true
console.log(Boolean(-1)); // true
console.log(Boolean('""')); // true
console.log(Boolean(' ')); // true
console.log(Boolean(Infinity)); // true
console.log(Boolean(-Infinity)); // true
console.log(Boolean({})); // true
console.log(Boolean([])); // true
Zero jest tutaj zapisane jako string, a niepusta wartość string konwertuje się do true
.
Liczba -1
także konwertuje się do true
, ponieważ nie ma jej na liście wartości fałszywych.
Wątpliwości mogą budzić te dwie wartości wyglądające jak puste znaki:
console.log(Boolean('""')); // true
console.log(Boolean(' ')); // true
Pierwsza z nich reprezentuje dwa znaki podwójnego cudzysłowu, druga reprezentuje trzy spacje. Nie są to więc puste stringi więc konwertują się na wartość true
.
Tak samo obiekty i listy. Nie jest istotne czy są to elementy puste, czy nie. Zawsze nastąpi konwersja do wartości true
.
Nie dajmy się więc zmylić takimi wartościami. Jak wspominałem, wystarczy zapamiętać, co jest wartościami fałszywymi, jeżeli coś nie istnieje na liście wartości fałszywych, przekonwertuje się do true
.
Konwersja przez operator logicznej negacji do boolean
Oprócz funkcji Boolean()
, możecie spotkać się z konwersją do typu boolean
przez użycie podwójnego operatora logicznej negacji. Operator logicznej negacji omówmy jeszcze dodatkowo przy operatorach logicznych.
Teraz bardziej skupimy się na tym, jak konwertować wartości za pomocą tego operatora.
Na razie przyjrzyjmy się, co robi operator negacji, czyli pojedynczy wykrzyknik !
:
console.log(!true); // false
console.log(!false); // true
console.log(!null); // true
console.log(!'test'); // false
Za jego pomocą, jawnie konwertujemy do wartości boolean
, ale odwracamy wynik. Dlatego wszystko, co powinno być true
staje się false
, a wszystko, co powinno być false
, staje się true
.
Co prawda przekonwertowaliśmy wartości na typ boolean
, ale są one odwrócone. Jeżeli jednak chcemy przekonwertować wartość do typu boolean
bez odwracania wartości, należy użyć podwójnego operatora negacji:
console.log(!!null); // false
console.log(!!0); // false
console.log(!!'test'); // true
To działanie tak naprawdę ma dwa kroki. Pierwszy to konwersja do boolean
i odwrócenie wartości. Drugi krok to ponowne odwrócenie wartości boolean
. Otrzymujemy tym razem prawidłowe wartości w typie boolean
.
Może się to wydawać za mało wydajne lub zbyt skomplikowane, sposób ten jest jednak dość często spotykany w kodzie. Jest bardzo krótki zapis jawnej konwersji do boolean
.
Konwersja boolean
na number
Gdy chcemy dokonać konwersji boolean
na typ number
mamy sporo możliwości.
Pierwszą z nich jest oczywiście użycie funkcji Number()
:
console.log(Number(true)); // 1
console.log(Number(false)); // 0
Jest to bardzo czytelny zapis konwersji. Z wartości true
otrzymujemy wartość 1
, natomiast z wartości false
otrzymujemy wartość 0
. To wynika głównie ze specyfikacji ECMAScript.
Niech was jednak nie zmyli to, że tylko liczba 1
konwertuje się ponownie na wartość true
:
console.log(Boolean(-1)); // true
console.log(Boolean(-100)); // true
console.log(Boolean(999)); // true
console.log(Boolean(1.2)); // true
console.log(Boolean(0.000009)); // true
Oczywiście każda liczba różna od 0
i -0
będzie konwertowana na true
bo tak wynika ze specyfikacji i tabelki wartości fałszywych. Więc nie wpadnijmy w pułapkę, że tylko liczba 1
jest wartością true
.
Możemy jeszcze dokonać konwersji za pomocą jednoargumentowego operatora +
:
console.log(+true); // 1
console.log(+false); // 0
Jest to jawna konwersja do typu number
. Operator +
jest używany do konwersji wszystkich wartości na typ number
, nie tylko wartości boolean
i oczywiście może nam zastąpić funkcję Number()
.
To samo możemy zrobić za pomocą jednoargumentowego operatora negacji reprezentowanego przez znak -
, ale wtedy otrzymujemy wartości ujemne:
console.log(-true); // -1
console.log(-false); // -0
Niech was nie zdziwi wartość -0
, wartość taka istnieje w JavaScript.
W Internecie znajdziecie jeszcze więcej pomysłów konwersji wartości boolean
na typ number
. Co będziecie używać, zależy głównie od Waszych preferencji i ustaleń w teamie. Dla mnie najczytelniejszą wersją konwersji jest wersja z funkcją Number()
.
Konwersja boolean
na string
Ostatnią możliwą konwersją typu boolean
jest konwersja na typ string
. Konwersja na typ string
jest bardzo prosta, możemy na wartości boolean
, wywołać metodę toString()
:
const b1 = true;
const b2 = false;
console.log(b1.toString()); // 'true'
console.log(b2.toString()); // 'false'
Otrzymamy wartości w postaci tekstu. Pamiętajmy, że nie ma już odwrotu i nie możemy z wartości tekstowej 'false'
, uzyskać wartości false
w typie boolean
. Z tekstowej wartości 'false'
otrzymamy wartość true
po konwersji za pomocą funkcji Boolean()
:
console.log(Boolean('false')); // 'true'
Oczywiście już wiemy dlaczego tak się dzieje. Tylko puste stringi według tabelki wartości fałszywych mogą konwertować się do wartości fasle
. Dlatego powrotu do wartości false
już nie ma za pomocą zwykłej konwersji do boolean
.
Ponieważ wywołanie metody toString()
może być czasami niebezpieczne, gdy natrafimy na wartość null
lub undefined
warto też wykorzystać funkcję String()
do jawnej konwersji.
console.log(String(b1)); // 'true'
console.log(String(b2)); // 'false'
Kolejnym sposobem na konwersję, chociaż mniej jawne jest użycie operatora +
z dwoma argumentami:
console.log(true + ''); // 'true'
console.log(false + ''); // 'false'
Gdy jedna ze stron reprezentuje typ string
nie następuje tutaj działanie matematyczne a konkatenacja stringów. Dlatego w tym przypadku wartości boolean
przechodzą przez konwersję do typu string
i ostatecznie są łączone z pustym stringiem. Dostajemy więc wartości boolean
zapisane jako string.
Co warto zapamiętać
- każdą wartość w JavaScript da się przekonwertować na typ
boolean
- jawna konwersja na typ
boolean
jest przewidywalna, gdy znamy tabelkę wartości fałszywych - jeżeli czegoś nie ma w wartościach fałszywych to zawsze będzie wartością
true
- do konwersji jawnej na typ
boolean
używamy funkcjiBoolean()
- kolejnym sposobem konwersji jawnej jest użycie operatora logicznej negacji
!
- przy konwersji na typ
number
używamy funkcjiNumber()
lub operatora jednoargumentowego+
oraz-
- przy konwersji na typ
string
używamy metodytoString()
, funkcjiString()
lub korzystamy z konkatenacji znaków przez operator+