Operatory || oraz && w JavaScript to klasyczne operatory logiczne. Działają na wartościach, które można zinterpretować jako prawdę lub fałsz (tzw. wartości truthy i falsy) i zwracają wynik wyrażenia logicznego. && oznacza „i” logiczne – całe wyrażenie jest prawdziwe tylko wtedy, gdy oba operandy są traktowane jako prawdziwe. || oznacza „lub” logiczne – wystarczy, że jeden z operandów jest prawdziwy, żeby całe wyrażenie było uznane za prawdę. W praktyce bardzo często wykorzystuje się je w instrukcjach warunkowych, np.: if (isLoggedIn && isAdmin) { … } albo if (isMobile || isTablet) { … }. W JavaScript te operatory mają jeszcze jedną, moim zdaniem bardzo przydatną cechę: nie zwracają po prostu true/false, tylko konkretną wartość jednego z operandów. Na przykład: const name = userName || "Gość"; – jeśli userName jest wartością „falsy” (np. pusty string, null, undefined), to do name trafi "Gość". To jest tzw. krótkie spięcie (short-circuit evaluation): przy operatorze &&, jeśli pierwszy operand jest falsy, drugi nie jest już w ogóle obliczany; przy ||, jeśli pierwszy jest truthy, drugi też nie jest sprawdzany. W dobrych praktykach front-endu wykorzystuje się to do prostego ustawiania wartości domyślnych, zabezpieczania wywołań funkcji (np. callback && callback()) oraz budowania bardziej czytelnych warunków. Warto też pamiętać o różnicy między operatorami logicznymi (&&, ||, !) a porównania (===, !==), bo to są różne grupy operatorów, chociaż często używa się ich razem w tych samych warunkach. Z mojego doświadczenia, świadome używanie tych operatorów logicznych bardzo upraszcza kod i zmniejsza liczbę if-ów rozrzuconych po skryptach.
Operatory || oraz && w JavaScript wielu osobom mylą się z innymi grupami operatorów, bo wizualnie przypominają różne zapisy z innych języków i z niższych poziomów programowania. Warto to sobie dobrze poukładać, bo odróżnianie operatorów logicznych, bitowych, arytmetycznych i przypisania to absolutna podstawa przy pisaniu czytelnego kodu. Wariant bitowy w JavaScript to pojedyncze symbole: | oraz &. One działają na poziomie bitów liczby całkowitej, wykonując operacje OR i AND na poszczególnych bitach. || oraz && to zupełnie inna bajka – nie grzebią w bitach, tylko pracują na logice programu, na warunkach i przepływie sterowania. Typowy błąd myślowy polega na tym, że ktoś zna z elektroniki „AND” i „OR” na bramkach logicznych i wrzuca wszystko do jednego worka z „bitami”. W JavaScript trzeba jednak rozróżniać: podwójne znaki to logika, pojedyncze to operacje bitowe. Mylenie tych dwóch typów operatorów może prowadzić do bardzo dziwnych wyników, szczególnie gdy nagle zaczynamy dostawać liczby zamiast oczekiwanych wartości logicznych. Innym źródłem pomyłek jest utożsamianie || i && z operatorami przypisania. Operator przypisania to w czystej postaci =, a jego rozszerzenia to np. +=, -=, *=, /=, ale również |= czy &=, które łączą przypisanie z operacją bitową. Nie istnieje coś takiego jak ||= w sensie standardowego operatora logicznego przypisania w starszym JavaScript (dopiero nowsze wersje wprowadziły logiczne operatory przypisania, ale to nadal nie to samo, co zwykłe || w warunku). Z kolei operatory arytmetyczne, takie jak +, -, *, /, %, służą do obliczeń matematycznych, nie do podejmowania decyzji w kodzie. Oczywiście można ich użyć w warunku, ale nie pełnią funkcji łączenia wyrażeń logicznych. Dobra praktyka jest taka, żeby w warunkach if, while czy for używać właśnie operatorów logicznych do łączenia prostych porównań, a operatory arytmetyczne zostawić do obliczeń. Moim zdaniem, jasne rozróżnienie tych grup operatorów przekłada się na kod, który jest łatwiejszy do utrzymania i mniej podatny na dziwne, trudne do wykrycia błędy.