Chciałbym wiedzieć, czy JavaScript ma ocenę „zwarcia”, taką jak && Operator w C #. Jeśli nie, chciałbym wiedzieć, czy istnieje obejście, które ma sens.
javascript
short-circuiting
GibboK
źródło
źródło
https://www.google.com/search?q=site:stackoverflow.com+%s
jako skrót wyszukiwania (Chrome / Firefox), aby przyspieszyć wyszukiwanie.Odpowiedzi:
Tak, JavaScript ma ocenę „zwarcia”.
DEMO na żywo
DEMO na żywo
źródło
Short-circuit
z tym operatorem logicznym. Po prostu spróbuj sam. Skorzystaj z mojego demo.Ta odpowiedź zawiera bardzo szczegółowe informacje na temat tego, jak to zrobić zwarciedziała w JavaScript, ze wszystkimi gotcha, a także odpowiednimi motywami, takimi jak pierwszeństwo operatorów, jeśli szukasz szybkiej definicji i już rozumiesz, jak działa zwarcie, polecam sprawdzenie innych odpowiedzi.
Co (myśleliśmy, że) wiedzieliśmy do tej pory:
Najpierw przyjrzyjmy się zachowaniu, które wszyscy znamy, wewnątrz
if()
bloku, w którym używamy&&
do sprawdzenia, czy te dwie rzeczy sątrue
:Twoim pierwszym odruchem jest prawdopodobnie powiedzenie: „Ach tak, całkiem proste, kod wykonuje instrukcję, jeśli oba
expr1
iexpr2
są oceniane jakotrue
”Cóż, tak i nie. Jesteś technicznie poprawny, to jest zachowanie, które opisałeś, ale nie tak dokładnie jest oceniany kod i będziemy musieli zagłębić się głębiej, aby w pełni zrozumieć.
Jak dokładnie jest interpretowane
&&
i ?||
:Czas zajrzeć „pod maskę javascript silnik ”. Rozważmy ten praktyczny przykład:
Wynik jest taki
260
… ale dlaczego? Aby uzyskać odpowiedź, musimy zrozumieć, jak działa ocena zwarcia.Oznacza to, że w naszym praktycznym przykładzie wartość
const res
jest oceniana w następujący sposób:expr1
-sanitise(0xFF)
0xFF
jest prawidłową liczbą szesnastkową dla 250, w przeciwnym razie zwróciłbymNaN
expr1
Zwrócona wartość „truthy”, czas na wykonanieexpr2
(inaczej wpadnę jakNaN
to falsy)userinput
jest truthy (liczba), mogę dodać+5
do niegoWięc tutaj mogliśmy uniknąć dodatkowych
if
blokad i dalszychisNaN
kontroli dzięki prostemu użyciu&&
operatora.Jak to naprawdę działa:
Do tej pory powinniśmy mieć przynajmniej obraz tego, jak plik zwarcieoperatorzy pracują. Uniwersalna zasada brzmi:
(some falsy expression) && expr
oceni do fałszywego wyrażenia(some truthy expression) || expr
oceni do prawdziwego wyrażeniaOto kilka dalszych przykładów dla lepszego zrozumienia:
Ostatnia nieznośna, ale bardzo ważna rzecz [Pierwszeństwo operatora]:
Fajnie, miejmy nadzieję, że zrozumiesz to! Ostatnią rzeczą, którą musimy wiedzieć, jest zasada dotycząca pierwszeństwa operatorów, czyli:
&&
Operator jest zawsze wykonywany przed||
operatora.Rozważmy następujący przykład:
To powróci jako, być może myląco dla niektórych, jak
a()
. Rozum jest dość prosty, tylko wzrok nas zwodzi, ponieważ jesteśmy przyzwyczajeni do czytania od lewej do prawej. Wyjmijmy,console.log()
a co nie, i skupmy się wyłącznie na ocenieTeraz, aby owinąć głowę wokół tego:
Powiedzieliśmy, że
&&
operator ma pierwszeństwo, więc jest oceniany jako pierwszy. Aby pomóc nam lepiej wyobrazić sobie ocenę, pomyśl o definicjiGdzie:
expr2
jestfalse
expr1
jesttrue || false
Więc to była trudna część, teraz
true || false
jest oceniana (expr1
- lewa strona&&
).||
operator zatrzymuje wykonywanie, jeśliexpr1 || expr2
wexpr1
oszacuje się jako prawda,expr1
jest wykonywany, a wykonywanie kodu zatrzymuje się.Zwracana wartość to
true
Cóż… to było dość trudne, wszystko z powodu kilku dziwnych reguł i semantyki. Pamiętaj jednak, że zawsze możesz uniknąć pierwszeństwa operatora za pomocą
()
- tak jak w matematyceźródło
expr1
aexpr2
lubcondition1
czy cokolwiek innego, to jest po prostu mylące. Zdecyduj się na jedną, możesz też wprowadzić zmienne lokalne, np.const expr1 = true; if(expr1 && ...)