Operatory porównań w JS

W JS typ danych jest bardziej podpowiedzią dla programisty niż jakimkolwiek limitem. Na przykład taki kod:

var a = 12;
a = "To jest string";

Nie wywoła błędu. Zmienna to po prostu pudełko, co w nią włożymy to tam będzie.

Co jeśli będziemy chcieli porównać dwie wartości?

var a = 10,
    b = '10';
if (a == b) { alert('są równe'); }

Czy oby jednak naprawdę są równe… Jedna zmienna jest liczbą, a druga ciągiem znaków.

I tu właśnie wchodzi operator “identyczności”  `===”.

var a = 10,
    b = '10';
if (a == b) { alert('są równe'); }
if (a === b) { alert('są identyczne'); }

W JS lepiej jest stosować ===, gdyż wtedy dokładnie wiemy co chcemy uzyskać.

Falsy values

Czyli w skrócie te wartości, które są uważane za fałsz w warunkach:

  • undefined – niezdefiniowana zmienna
  • null
  • "" – pusty string
  • 0 – wartość liczbowa
  • NaN – not a number
  • false – typ logiczny

Dla takiego kodu Firefox zwraca wyniki podane jako komentarz:

var a = null;
if (false == a) { alert(a + ' to falsy value 1'); } // "", 0, false
if (!a) { alert(a + ' to falsy value 2'); } // wszystkie
if (false === a) { alert(a + ' to falsy value 3'); } // tylko `false`

Jak widać drugi sposób mówi nam tak naprawdę najmniej. Wiadomo, że coś nie jest prawdą [ale czym tak naprawdę jest to już nikt nie wie].

Jestem zdania, że aby programować dobrze trzeba wiedzieć na jakich typach danych się operuje. Stąd polecam używać operator `===’ w warunkach.

Uwaga na NaN

Not a number (NaN) jest wartością szczególną. Jako jedyna w żaden sposób nie równa się niczemu. Nawet samej sobie!

var x = NaN;
if (x == x) { console.log('=='); } else { console.log('nie ==') };
if (x === x) { console.log('==='); } else { console.log('nie ===') };
if (x > x) { console.log('>'); } else { console.log('nie >') };
if (x > 0) { console.log('> 0'); } else { console.log('nie > 0') };
if (x < x) { console.log('<'); } else { console.log('nie <') };
if (x < 0) { console.log('< 0'); } else { console.log('nie < 0') };

Jak sprawdzić czy wartość jest NaN (not-a-number) w Javascript?

Skoro nie ma możliwości używania operatorów porównania to może po typie?

typeof NaN;

W wyniku da: “number”. Jednak jeśli sprawdzimy, czy NaN jest instancją (operator instanceOfNumber dostaniemy false (co nawet brzmi racjonalnie, bo nazwa tej specjalnej wartości to dosłownie w tłumaczeniu: “nie-liczba”).

Jak zatem to zrobić?! Rozwiązaniem jest specjalna funkcja:

isNaN(x); // wynik true

Więcej:

Jeśli zainteresowało cię porównywanie wartości w JS i chciałbyś się o tym dowiedzieć więcej proponuję strony:

1 comment

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.