Zawsze musiałem stawiać null
na inne warunki, które nic nie mają. Czy jest coś dookoła? Na przykład
condition ? x = true : null;
w zasadzie, czy jest na to sposób:
condition ? x = true;
Teraz pojawia się jako błąd składni
FYI, oto prawdziwy przykładowy kod:
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
javascript
optimization
syntax-error
Oscar Godson
źródło
źródło
condition ? x = true : null;
powinno być prawdopodobnie zapisane jakox = (condition ? true : null);
. Nawiasem mówiąc, w javascriptnull
ocenia się na false, więc w TYM przypadku możeszx = (condition);
i osiągnąć ten sam wynik.if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
Odpowiedzi:
Po pierwsze, wyrażenie trójskładnikowe nie jest zamiennikiem konstrukcji if / else - jest odpowiednikiem konstrukcji if / else, która zwraca wartość. Oznacza to, że klauzula if / else jest kodem, a wyrażenie trójskładnikowe jest wyrażeniem , co oznacza, że zwraca wartość.
Oznacza to kilka rzeczy:
=
której ma zostać przypisana wartość zwracana, znajduje się zmiennax = true
zwraca prawdę, ponieważ wszystkie wyrażenia zwracają ostatnią wartość, ale także zmienia x bez x, które mają wpływ na zwracaną wartość)Krótko mówiąc - „prawidłowe” użycie wyrażenia trójskładnikowego to
Zamiast przykładu
condition ? x=true : null ;
, w którym używasz wyrażenia trójskładnikowego do ustawienia wartościx
, możesz użyć tego:Jest to nadal wyrażenie i dlatego może nie przejść walidacji, więc byłoby jeszcze lepsze podejście
Ostatni przejdzie walidację.
Ale z drugiej strony, jeśli oczekiwana wartość jest wartością logiczną, po prostu użyj wyniku samego wyrażenia warunku
AKTUALIZACJA W odniesieniu do twojej próbki jest to prawdopodobnie bardziej odpowiednie:
źródło
i/else
literówkę, ponieważ nie ma wystarczającej liczby znaków.void()
. dzięki.Nie, potrzebuje trzech operandów. Dlatego nazywane są operatorami trójskładnikowymi .
Jednak dla tego, co masz jako przykład, możesz zrobić to:
Chociaż bezpieczniej jest mieć nawiasy klamrowe, jeśli chcesz dodać więcej niż jedną instrukcję w przyszłości:
Edycja: Teraz, gdy podasz rzeczywisty kod, którego dotyczy Twoje pytanie:
źródło
Coraz częściej ludzie używają operatorów logicznych, aby skrócić składnię instrukcji:
Ale w twoim konkretnym przypadku składnia może być jeszcze prostsza
Ten kod zwróci
defaults.slideshowWidth
wartość, jeślidefaults.slideshowWidth
zostanie oszacowana jako true iobj.find('img').width()+'px'
wartość w przeciwnym razie.Aby uzyskać szczegółowe informacje, patrz Ocena zwarć operatorów logicznych.
źródło
źródło
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')
lubdefaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
Możesz pisać
Tak więc x jest niezmodyfikowane, gdy warunek jest fałszywy.
To jest równoważne z
EDYTOWAĆ:
Jest kilka alternatyw - nie mówię, że są lepsze / gorsze - są to tylko alternatywy
Przekazywanie wartości null jako trzeciego parametru działa, ponieważ istniejąca wartość ma wartość null. Jeśli dokonasz refaktoryzacji i zmienisz warunek, istnieje niebezpieczeństwo, że nie jest to już prawdą. Przekazywanie istniejącej wartości jako drugi wybór w trójskładnikowej ochronie przed tym:
Bezpieczniejsze, ale może nie tak przyjemne dla oka i więcej pisania. W praktyce pewnie bym napisał
źródło
W twoim przypadku widzę operator trójskładnikowy jako zbędny. Możesz przypisać zmienną bezpośrednio do wyrażenia, używając operatorów ||, &&.
stanie się :
Jest bardziej przejrzysty, bardziej w stylu „javascript”.
źródło
A co po prostu
źródło
Aby użyć operatora trójargumentowego bez innego elementu wewnątrz tablicy lub deklaracji obiektu, można użyć operatora rozproszenia ES6
...()
A dla obiektów:
Pierwotnym źródłem
źródło