Widoczne szaleństwo JavaScript [duplikat]
Możliwy duplikat:
Sprzeczne wartości logiczne pustej tablicy JavaScript
Jakie jest uzasadnienie tego faktu
[ ([] == false), ([] ? 1 : 2) ]
zwraca[true, 1]
?
Innymi słowy pusta lista jest logicznie prawdziwa w kontekście boolowskim, ale jest równafalse
.
Wiem to używając===
rozwiązuje problem, ale jakie jest wyjaśnienie tego pozornie całkowicie nielogicznego wyboru?
Innymi słowy, jest to uważane za błąd w języku, coś niezamierzonego, które właśnie się wydarzyło i którego nie można naprawić, ponieważ jest zbyt późno lub naprawdę w projektowaniu języka, ktoś pomyślał, że fajnie jest mieć tego rodzaju pozorne szaleństwo, które jestem na pewno jest mylące dla wielu programistów?
Techniczne wyjaśnienie, jak to się dzieje, jest jednocześnie niesamowite i przerażające, jednak bardziej interesowało mnie to, co kryje się za tym projektem.
EdytowaćPrzyjąłem bardzo szczegółowe wyjaśnienie Nicka Retallacka, nawet jeśli chodzi tylko o przyczyny techniczne[]==false
jest prawdą: co zaskakujące, dzieje się tak, ponieważ[]
konwertowane na łańcuch znaków jest pustym łańcuchem, a wartość liczbowa pustego łańcucha jest specjalnym przypadkiem na 0 zamiast na pozornie bardziej logicznymNaN
. Z pustym obiektem na przykład porównanie({}) == false
zwraca false, ponieważ reprezentacja łańcucha pustego obiektu nie jest pustym łańcuchem.
Moja ciekawość wciąż polega na tym, że wszystko to jest nieoczekiwane (a teraz niestety umocnione w standardzie).