Od jakiegoś czasu ślęczę nad cudzym kodem javascript (nie pytajcie jak to się stało). No i co jakiś czas wyławiam "kfiatki" typu używanie niezdefiniowanej zmiennej itp.
Ale wczoraj znalazłem coś takiego, co umocniło mnie w przekonaniu żeby na prawdę uważać przy konstruowaniu instrukcji warunkowych i zawsze kilka razy przemyśleć, czy to co wpisałem ma jakikolwiek sens. Oczywiście nie muszę chyba przypominać, żeby stawiać nawiasy wszędzie tam, gdzie jest choćby mała wątpliwość odnośnie kolejności wykonywania działań, bo po miesiącu może być krucho z przypomnieniem sobie co tak właściwie jest sprawdzane w danym "ifie".
Poniżej jest "kfiatek" o którym mowa. Na pierwszy rzut oka jest to instrukcja jakich wiele, ale proponuję zastanowić się co tam się dzieje:
if (!zmienna == 'jakisString') { /* ciało warunku */ }
Zmienna o nazwie zmienna jest typu znakowego (string). Ponieważ w tej instrukcji nie ma nawiasów, to interpreter javascript widzi to tak:
if ((!zmienna) == 'jakisString') { /* ciało warunku */ }
Co z tego wynika? Ano to, że nie zostaną wykonane instrukcje zawarte w ciele warunku (w tym przypadku to tylko komentarz). Stanie się tak dlatego, że interpreter javascript widząc kod: !zmienna zamieni po cichu typ zmiennej zmienna, ze string na typ logiczny i potem zastosuje operator "!".
Po lewej stronie operatora == będziemy więc mieli zmienną typu logicznego a po prawej zwykłego string'a. Niestety javascript w tym przypadku nie dokona automatycznego rzutowania 'jakisString' do zmiennej typu logicznego, zaś próba porównania zmiennych dwóch różnych typów zwraca zawsze wartość false (no bo przecież string nie jest boolean'em), co również następuje w naszym przypadku.
Autorowi owego wybryku chodziło prawdopodobnie o sprawdzenie, czy zmienna jest różna od 'jakisString', czyli o wyrażenie:
Po lewej stronie operatora == będziemy więc mieli zmienną typu logicznego a po prawej zwykłego string'a. Niestety javascript w tym przypadku nie dokona automatycznego rzutowania 'jakisString' do zmiennej typu logicznego, zaś próba porównania zmiennych dwóch różnych typów zwraca zawsze wartość false (no bo przecież string nie jest boolean'em), co również następuje w naszym przypadku.
Autorowi owego wybryku chodziło prawdopodobnie o sprawdzenie, czy zmienna jest różna od 'jakisString', czyli o wyrażenie:
if (zmienna != 'jakisString') { /* ciało warunku */ }
Brak komentarzy:
Prześlij komentarz