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:
var oBool = new Boolean(false);
Ktoś powie - "fajnie, mamy obiektowość, nawet w najbanalniejszych rzeczach". Zaraz potem, zapomni się i zrobi taki kod:
var oBool = new Boolean(false);
if (oBool)
{
alert("Nam nikt nie powie, że fałsz to prawda...\nUppps, JS jednak to zrobiła");
}
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
var oBool = new Boolean(false);
if (true === oBool)
{
alert("Nam nikt nie powie, że fałsz to prawda...\nUppps, JS jednak to zrobiła");
}
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'.
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");
}
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.