Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Co myślicie o modzie, że teraz wszędzie gdzie można pcha się === i !==. Temat zastanawia mnie od dłuższego czasu i wraca co code review. I jak widzę taki przykład
Podstawowe pytanie - w czym to przeszkadza? Możesz jakoś uzasadnić, co w tym złego? Bo ja uważam (podobnie do @phanc powyżej) - taki zapis sprawdza nie tylko wartość, ale typ, więc robi to samo co wersja krótsza, ale jeszcze ma bonus.
No chyba, że ktoś chce porównać wartości, ale nie patrząc na typ - tylko wtedy to nie jest kwestia preferencji, ale odpowiedniego doboru do potrzeb, więc także nie zalicza się to do tematyki tego wątku. W każdym razie - nie widzę niczego złego w zastosowaniu operatora identyczny zamiast równy.
To mi się podoba. Nie dość, że podkreśla równość między r1 i r2 (zdodnie z hasłem: wszystkie rn są równe) to jeszcze zgodne z zasadami dystansu społecznego, ogranicza przenoszenie się zarazków.
@mr_jaro: wszystkiego nie przetestujesz, let's be real. Jest wiele sytuacji, gdzie pomyłka w typowaniu doprowadza do trudnych do znalezienia błędów i metoda zdąży narozrabiać zanim się wykrzaczy na typie.
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.
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 == ''.
=== 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ć ===
zależy od przeglądarki, dla tych samych typów na pewno nie. Chrome został zoptymalizowany ostatnio i jest tak samo szybkie, w firefoksie nadal jest spora różnica (koło 20%). Tak czy inaczej przejmowanie się performancem na tym poziomie w javascript nie ma dużego sensu przy wykorzystaniu współczesnym frameworków
@bearek: 534652346346234634 == "534652346346234633" jest 100 razy wolniejsze nawet na chromie niż 534652346346234634 === "534652346346234633" . https://jsbench.me/wskgl15rpr/1 W drugim przypadku zwraca false od razu bo wie że typy są różne, w pierwszym przypadku musi najpierw zamienić string na liczbę - im dłuższy string tym wolniejsze porównanie, dla długich ciągów jest to nawet 10 000x wolniejsze. Więc wszystko zależy od tego co porównujemy i jakich oczekujemy rezultatów
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:
Kopiuj
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.
Zobacz pozostały 1 komentarz
PerlMonk
@Freja Draco: Trochę to jest "zepsute", ale czy IDE nie podkreśla tu błędu?
no tym właśnie są yoda conditions. Osobiście ich nie lubię, bo IDE i tak pokazuje takie błędy a wygląda to śmiesznie. Poza tym trzeba być naprawdę konsekwentnym i o tym pamiętać żeby dzięki temu ustrzec się od błędu. Podejrzewam że łatwiej zapamiętać żeby używać dwóch znaków równości niż o tym
PerlMonk
@obscurity: Nie czytałem linku. Używam tego nawet nie patrząc na nazwę :D
Jak programujesz w Pascalu i innych językach, to może. Ale operator przypisania w Pascalu jest na tyle odseparowany od sprawdzania równości, że się o nim nie zapomina. Mówisz o zapominaniu, bo jesteś przyzwyczajony z innych języków. Programiści Pascala nie mieli tego problemu i ten błąd praktycznie nie istniał.
PerlMonk
Ja tego problemu nie mam w żadnym języku, bo nie zapominam, więc argument, że programiści Pascal nie zapominają jest z kosmosu.
Ja też nie mam, ale wielu programistów ma. Dlatego przecież mamy yodę. Napisałbym wywód dlaczego = jest mylone z ==, ale muszę teraz uciekać. Może później :)
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.
@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.
Trochę za dużo pisania jak na tak podstawową operację, ale ogólnie się zgadzam z Tobą, że ten operator powinien być wyraźnie inny niż porównanie. Ale inną opcją byłaby zmiana operatora porównania :)
To powinno być raczej coś zupełnie odmiennego, coś w stylu: x << a + b
Rozwiązanie twoich problemów jest przypisanie nie zwracające wartości co często jest robione w nowszych językach programowania. Np. w Scali if (a = b) jest niepoprawne bo a = b zwraca Unit. Podobnie w Ruscie jest w dokumentacji
:= jest już lepsze, ale jak wchodziłam w Pascal z Basica, to też mi się myliło.
To powinno być raczej coś zupełnie odmiennego, coś w stylu: x << a + b
Ew. rozwiązaniem mogłoby być też podejście zupełnie odmienne:
x = 1 + 2;
if (x = 2) wystrzel_rakietę();
I parser, który zależnie od kontekstu odpowiednio interpretuje znak równości.
Chociaż możliwe, że to też mogłoby czasem generować jakieś nieoczywiste błędy.
@tbh Jacy "wy"? Ja tu niczego nie projektuję, tylko mówię, że pewnie można to lepiej rozwiązać. Ba, jestem pewien że za kilka lat wymyślą coś lepszego niż = i ==.
Ew. rozwiązaniem mogłoby być też podejście zupełnie odmienne:
x = 1 + 2;
if (x = 2) wystrzel_rakietę();
I parser, który zależnie od kontekstu odpowiednio interpretuje znak równości.
Chociaż możliwe, że to też mogłoby czasem generować jakieś nieoczywiste błędy.
Jeśli przypisanie zwraca zawsze unit/void, a porównanie zwraca zawsze boolean to nie powinno być to problemem. (Dalej problemem jest to że JS jest dynamicznie typowany) Tak jest przecież SQLu. Tak było w pascalopodobnym języku programowania w GameMakerze jak się tym bawiłem 10 lat temu
No fajnie, ale tu też możesz zapomnieć jednego znaku i kod się skompiluje.
What?! Panie, kod w żadnym dialekcie Pascala nigdy nie zostanie skompilowany, jeśli zamiast operatora przypisania użyjesz porównania. Czemu takie fake newsy rozpuszczasz? :P
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ć.
Myślę, że po jakimś czasie da się tego nauczyć i wstawiać te operatory odruchowo. Co w dalszym ciągu nie zmienia faktu, że trzy różne operatory porównania to trzy razy więcej miejsc do popełnienia błędów. I za to twórcy języka „powinni zapier****ć na galerze”.
A ten dwukropek jest tak wyróżniający, że uwierz mi - po jakimś czasie od razu się jego brak rzuca w oczy.
Rzuca się w oczy, a jeszcze bardziej błędy kompilacji wynikające z jego braku. ;)
Przez wieeeele lat pisania w Pascalu nie przypominam sobie ani razu sytuacji, w której zastosowałem zamiennie = lub :=.
A mi się zdarzało wielokrotnie — czasem się nie wpisał, bo albo za szybko pisałem i myślałem o dalszej części, albo źle stuknąłem w klawisz. No ale taka konstrukcja nie ma prawa się skompilować, bo rezultat każdego porównania musi być do czegoś użyty — przypisany do zmiennej lub puszczony jako argument funkcji.
To samo w drugą stronę — przypisanie jest możliwe tylko do zmiennej i nie ma możliwości wykorzystania go np. w nagłówku instrukcji warunkowej czy w wywołaniu funkcji (w argumencie). Pascal nie posiada patologii znanej z C, i bardzo dobrze, bo dzięki temu jest banalny do zrozumienia.
Im więcej równości tym lepiej. ===============================================
Chciałbym zwrócić uwagę, że ten przykład jest nierówny. Występuje 47 znaków równości czyli nieparzyste. Aby była klasyczna równość pasowałoby mieć jednak parzystą ilość równości.