Nadużywanie operatora ===?

4

Nie wiem jak to działa w php ale w js/ts dobrą praktyką jest używanie === bo mało kto rozumie jak działa == co powodowało wiele błędów.
Np dla mnie poniższe odpowiedzi są mało intuicyjne i w gąszczu kodu wątpię abym wyłapał szybko tego typu błędy.

null == undefined //true
[0] == false //true
[1] == 1 //true
[[]] == "" //true
4
assembler napisał(a):

Nie uważacie że powinno się używać operatora domyślnego i krótszego ==?

Ja jestem zwolennikiem mocnych typów danych i uważam, że === jest domyślny.

0

Ja bym chciał, żeby typy były domyślnie sprawdzane z ==, a żeby miękkie sprawdzanie miało jakiś trudniejszy do zapisania operator. Miękkie typowanie doprowadza do baaaardzo wielu trudnych do wychwycenia błędów, szczególnie 0 == ''.

9

Dla przypomnienia javascript equality table:
js-table.png

fajne rzeczy z tego widać :-)

[0] == false
true
[0] == [0]
false

Logiczne

Dla porównania - w mniej zaawansowanych językach:
haskell_table.png
tu źródło

(I tu warto zaznaczyć, że to że [] == "" w Haskellu jest uznawane za błąd w designie języka, który niestety trudno teraz odkręcić)

2

=== nie tylko stwarza mniej problemów (zwłaszcza gdy porównujemy tablice, undefined, zero, boolean itp) ale też jest szybsze. Jeśli nie chcemy porównywać zmiennych o różnych typach, dane nie przychodzą od usera i nie chcemy niespodziankowego rzutowania typów to lepiej użyć ===

https://jsbench.me/wskgl15rpr/1

2

Słabe to jest to, że zarówno do podstawiania jak i porównywania używa się znaków równości, a na dodatek parser JS nie widzi żadnego problemu w takim zapisie:

var x=1;
if (x=2) alert(2);

Bo przecież każdy normalny człowiek będzie zainteresowany sprawdzeniem tego, czy operacja podstawienia się udała :p

Nie wiem, jak innym, ale mi się raz na jakiś czas zdarza taki błąd i szukanie go zawsze rozwija poziom kwiecistości mego języka.

3

Słabe to jest to, że zarówno do podstawiania jak i porównywania używa się znaków równości

I tutaj wbija na białym, bardzo leciwym (jakieś 50 lat) koniu Pascal ze swoim = sprawdzenie oraz := przypisanie. Ciężko to pomylić :P

0
cerrato napisał(a):

Słabe to jest to, że zarówno do podstawiania jak i porównywania używa się znaków równości

I tutaj wbija na białym, bardzo leciwym (jakieś 50 lat) koniu Pascal ze swoim = sprawdzenie oraz := przypisanie. Ciężko to pomylić :P

No fajnie, ale tu też możesz zapomnieć jednego znaku i kod się skompiluje. Co za różnica czy to jest dwukropek czy drugi znak równości?

3

Tak, ale ten brak dwukropka od razu widać gołym okiem. Jak masz same równasię w ilości 1 do 3, to potem można się zakręcić. A ten dwukropek jest tak wyróżniający, że uwierz mi - po jakimś czasie od razu się jego brak rzuca w oczy. Przez wieeeele lat pisania w Pascalu nie przypominam sobie ani razu sytuacji, w której zastosowałem zamiennie = lub :=. Nie umiem tego wyjaśnić, ale takie podejście od samego początku, że jak chcesz przypisać to dodajesz dwukropek wyrabia pewne nawyki, które potem się przekładają na automatyczne pisanie. Coś jak w przypadku kierowcy, który po jakimś czasie w ogóle nie myśli o zmianie biegów, to się dzieje samodzielnie.

Może @furious programming będzie miał coś ciekawego do dodania ;)

0

@cerrato: Przyzwyczajenie - równie dobrze mogę się przyzwyczaić do odwracania kolejności operandów. Tu mówisz o dwóch różnych rzeczach: zabezpieczeniu na poziomie języka i człowieka. Gdybym chciał zrobić to na poziomie języka, zrobiłbym to tak cmp (zmienna, dupa) i nie stosował znaku równości do porównania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0