Instrukcje warunkowe i wartości logiczne

Kolejne instrukcje zapisane w języku JavaScript (jak i w każdym innym) zazwyczaj wykonują się w kolejności zapisu – sekwencyjnie: jedna za drugą. Jednak wiemy już, że działanie programu zależy od stanu obiektów. Nie zawsze ten stan wpływa jedynie na wynik wyrażenia. Na przykład chcąc uniknąć dzielenia przez zero – musimy sprawdzić wartość danych przed wykonaniem działania. Tego typu sprawdzenia wykonujemy przy użyciu instrukcji warunkowej, rozpoczynającej się od słowa if. Ma ona strukturę: if (warunek) blok_instrukcji. Blok instrukcji zaznaczamy nawiasami klamrowymi {}, a warunki nawiasami okrągłymi ().

Przykład:

> m=0;n=12;
> if (m == 0) {
console.log('Nie dziel przez zero');
} else {
wynik=n/m; console.log(wynik);
}
Nie dziel przez zero

Jeśli do zmiennej m wstawimy inną niż zero liczbę, uzyskamy wynik 12/m.

Instrukcja if służy do zaznaczenia bloku instrukcji, który się wykona wyłącznie wtedy, gdy prawdziwe będzie wyrażeni logiczne sprawdzane przed wejściem do tego bloku. Jeśli warunek jest spełniony, wykonywany jest blok instrukcji (możemy go określić jako "blok warunkowy"). w przeciwnym wypadku możemy wskazać inny blok instrukcji do wykonania. Służy do tego słowo (kluczowe) else. Użycie else jest opcjonalne.

Dwa znaki = (==) używamy w porównaniach dlatego, by nie mylić ich ze znakiem podstawienia (=). Choć to i tak jeden z najczęstszych błędów w programach.

Wartość logiczna

Wartość logiczna - jakiej używamy na przykład w instrukcji warunkowej - może zostać zapisana w zmiennej. Analogicznie jak w przypadku operacji arytmetycznych, język Javascript oferuje operatory do wyliczenia wartości logicznych:

  • true – wartość logiczna prawda
  • false – wartość logiczna fałsz

Wartość logiczną uzyskujemy przede wszystkim stosując operatory porównania:

  • mniejszy <
  • mniejszy lub równy <=
  • większy >
  • większy lub równy >=
  • równy ==
  • nierówny !=
  • porównanie dokładne ===
  • zaprzeczenie dokładnego porównania (różne) !==

Wyjaśnienia wymaga pojęcie dokładnego porównania. Widzieliśmy wcześniej, że Javascript potrafi zamienić liczbę na łańcuch znaków. Wartość prawdziwą zwraca więc wyrażenie:

‘22’ == 22

Porównanie dokładne zwraca prawdę jedynie wtedy, gdy wartości są równe bez dokonywania konwersji typów. Mamy zatem:

‘22’ !== 22

Javascript oferuje także operatory logiczne (algebry Boole’a):

  • Zaprzeczenie (nie): !
  • Alternatywa (lub): ||
  • Koniunkcja (oraz): &&

To jednak nie wszystko. Aby uprościć sprawdzanie, czy jakiś obiekt lub własność istnieje i nie jest „pusta” - przyjęto, że następujące wartości są równoważne z false:

  • null –czyli wartość pusta

  • undefined –własność nie zdefiniowana

  • 0 –liczba zero

  • "" -pusty łańcuch znaków

  • NaN –własność “to nie jest liczba"

Mamy tu jak widać także wartości odnoszące się do obiektów i ich własności. Ich znaczenie stanie się jasne, gdy poznamy szczegóły programowania obiektowego.

A jakie wartości są traktowane jako prawda (true)? Tu obowiązuje prosta reguła: wszystkie, które nie są fałszem (false).

Przykład:

if ("") {
    console.log("wartość logiczna true");
} else {
    console.log("wartość logiczna false");
}

Zwraca: "wartość logiczna false"

Leniwa ewaluacja

Wyrażenia logiczne są wyliczane od lewej do prawej. Gdy tylko uda się ustalić wartość logiczną - dalsza ewaluacja (obliczanie wartości) wyrażenia nie jest kontynuowana.

Przyład:

> if (test()==0) console.log('!');
ReferenceError: test is not defined
> if ((1>0) || (test()==0)) console.log('!');
!

W pierwszej linii nastąpi błąd, gdyż funkcja test() nie istnieje. Nie można więc sprawdzić jej wyniku. Gdy przed tym sprawdzeniem pojawi się wyrażenie prawdziwe (1>0) połączone z resztą spójnikiem lub (||) - dalsa część wyrażenia nie jest sprawdana.