Dlaczego new Boolean jest złym pomysłem

Javascript to język w pełni obiektowy. Obiektem jest wszystko: funkcja – obiekt, obiekt – obiekt, zmienna – obiekt… Eh, no i ta pełność ma swoje „widzimisie” i problemy.

Wartości logiczne

W klasycznej logice są dwie: true i false (prawda i fałsz). W JS istnieje jednak konstruktor dla wartości logicznych:

[javascript]var oBool = new Boolean(false);[/javascript]Ktoś powie – „fajnie, mamy obiektowość, nawet w najbanalniejszych rzeczach”. Zaraz potem, zapomni się i zrobi taki kod:

[javascript]var oBool = new Boolean(false);
if (oBool)
{
    alert("Nam nikt nie powie, że fałsz to prawda...\nUppps, JS jednak to zrobiła");
}[/javascript]

Dlaczego pojawia się alert?! Otóż, ma to związek z porównywaniem wartości w JS. Obiekt `oBool’ jest rzutowany w tej instrukcji warunkowej do wartości logicznej prostej. Jako, że pod zmienną `oBool’ przypisany jest obiekt, to rzutowanie do wartośći logicznej daje `true’. Stąd zamieszanie.

Rozwiązanie I

Można używać odpowiednio operatorów porównań. Przeczytaj: www.yarpo.pl/2011/01/19/operatory-porownan-w-js

[javascript]var oBool = new Boolean(false);
if (true === oBool)
{
    alert("Nam nikt nie powie, że fałsz to prawda...\nUppps, JS jednak to zrobiła");
}[/javascript]

I już działa prawidłowo.

Rozwiązanie II

Skoro zmienna `oBool’ jest obiektem Boolean, to może warto skorzystać z jego właściwości. Jedną z nich jest `value’.

[javascript]var oBool = new Boolean(false);
if (true === oBool.value)
{
    alert("Nam nikt nie powie, że fałsz to prawda...\nUppps, JS jednak to zrobiła");
}[/javascript]

W takiej sytuacji jednak tracimy na uniwersalności kodu, bo co jeśli ktoś przekaże nam prostą zmienną logiczną, a nie obiekt…

Rozwiązanie najlepsze

Nie używać `new Boolean’. Co to daje?

  • problem, wyżej opisany
  • zwolnienie pracy skryptu
  • zajęcie większej ilości pamięci
  • wydłużenie skryptu

Keep It Simple Stupid.

Dodaj komentarz

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