'' == '0' // false - ma sens, bo '' jest falsy, a '0' jako string to true
0 == '' // true - rowniez ma sens bo 0 jest falsy, tak samo jak ''
0 == '0' // true - nie ma sensu bo 0 jest falsy, a string powinien byc traktowany jako true tak jak w pierwszym porownaniu
false == 'false' // false - to samo co w pierwszym
false == '0' // true - znowu bez sensu tak samo jak 0 == '0'
false == undefined // false bez sensu, undefined zachowuje sie jako falsy, a w porownaniu to nie to samo
false == null // false - tak samo tutaj
null == undefined // true - 2 razy falsy, wiec się zgadza, ale dlaczego 2 powyższe się zachowują w taki dziwny sposób?
Możemy używać ===
. Tylko jest pewien problem. Jeżeli chcemy, żeby działało nam porównanie typu 0 == ''
, co ma sens (zgodnie z założeniami które wartości są falsy) to może to być zgubne. Zauważyłem, że jeżeli sami sobie skastujemy to na boolean a dopiero pozniej porównamy to zaczyna działać. Dlaczego jest taka rozbieżność?
// ! castuje na boolean, ale odwraca wartość, więc odwracamy ją jeszcze raz i robiąc !! otrzymujemy coś jak (boolean) zmienna
typeof !!'' // boolean
!!'' // false
!!'' == !!'0' // false - ma sens, bo '' jest falsy, a '0' jako string to true i tak też jest castowane
!!0 == !!'' // true - rowniez ma sens bo 0 jest falsy, tak samo jak '' i tak też jest castowane
!!0 == !!'0' // FALSE - zgadza się, bo !!'0' robi z tego true;
false == !!'false' // false - każdy string to true, więc to samo tutaj się dzieje
false == !!'0' // false - znowu to co wyżej
false == !!undefined // true - undefined jest falsy, wiec false == falsy => true i git
false == !!null // j.w.
!!null == !!undefined // true - 2 razy falsy, wiec się zgadza
Czyli stosowanie takiego porównania to taka pośrednia wersja pomiędzy ===
, a ==
. Pozwala na pewien luz (bo pokrywają się przykłady z 1 listingu) i nie daje takich bezsensownych nieprzewidywalnych wyników. Z drugiej strony wyglada to jak...
Naszła mnie jeszcze jedna myśl. Czy jeżeli porównujemy np. 0 == '0'
to w tym wpadku string jest castowany najpierw na number, a później obydwa na boolean i zachodzi porównanie? Jeżeli tak faktycznie jest to może i się to zgadza, co nie zmienia faktu, że wychodzi na to, że w zależności od kontekstu użycia zmienna ma różną wartość boolowską Oo
TL:DR
Czyli reasumując te wypociny:
var x = '0';
- Jeżeli użyjemy zmiennej w samej na zasadzie
if(x)
to zgodnie z zasadami truthy/falsy x da true i sterowanie wejdzie do if'a. - Jeżeli tą samą wartość porównamy z czymś to zachodzi rzutowanie tych typów w dół (zgodnie z tym jak te typy są rzutowane a nie truty/falsy), czyli jak mamy 0 i stringa to:
a) 0 => boolean == false;
b) '0' => number => 0 => boolean => 'false'
i stąd się bierze0=='0' == true
. - Sposób podany przeze mnie wyżej wymusza podczas porównania korzystanie z zasady truthy falsy
Zgadza się? :D