Podwójna negacja

JavaScript umożliwia zastosowanie wielu ciekawych trików w zakresie konstrukcji składniowych. Jednym z nich jest podwójna negacja. Służy do przekształcenia dowolnej wartości do wartości logicznej (true lub false). Dla programisty PHP problem może jednak sprawić fakt, że JavaScript troszkę inaczej niż PHP ewaluuje wartości do prawdy i fałszu.

Ale od początku. Podwójna negacja to nic innego jak powtórzony dwukrotnie zwykły operator negacji:

var a = 0;
console.log(!!a); // false

Możliwe jest stosowanie go również w PHP, jako zamiennika funkcji empty(). Niby nic szczególnego, ale pamiętać należy o przypadkach, które PHP i JavaScript ewaluują prawdę i fałsz nieco inaczej, co może sprawić problem osobom na co dzień posługującym się językiem PHP.

Pierwszy przypadek to pusta tablica. O ile w PHP pusta tablica jest ewaluowana do fałszu, o tyle w JavaScripcie jest na odwrót. Wbrew pozorom jest to zrozumiałe, jednak trzeba spojrzeć nieco na typ danych, na których operujemy. O ile w PHP tablica jest samodzielnym (prymitywnym) typem danych, o tyle w JavaScripcie jest obiektem. Obiekt zaś, niezależnie od tego, czy zawiera jakiekolwiek właściwości, zawsze jest traktowany jako niepusty (niezerowy) — również w PHP!.

Drugim przypadkiem jest string "0". JavaScript, po podwójnym zanegowaniu takiego stringa, zwróci nam wartość true. Ma to sens, wszak string nie jest pusty. W przypadku PHP dojdzie do rzutowania stringa do wartości numerycznej — ma to miejsce również w przypadku funkcji empty() i jest opisane w podręczniku PHP (a mimo faktu, że takie zachowanie jest nieintuicyjne, a przez niektórych wprost określane jako błędne, to stanowi część specyfikacji PHP i nie zostanie zmienione ze względu na potencjalny wpływ na działanie setek istniejących aplikacji PHP). Rezultatem będzie więc fałsz, pomimo tego, że string nie jest pusty.


Napisz komentarz


Szukaj wpisów


Chmura tagów