Nie mogę objąć głowy pierwszą częścią tego kodu (+ =) w połączeniu z operatorem trójskładnikowym.
h.className += h.className ? ' error' : 'error'
Sposób, w jaki myślę, że ten kod działa, jest następujący:
h.className = h.className + h.className ? ' error' : 'error'
Ale to nie jest poprawne, ponieważ powoduje to błąd w mojej konsoli.
Więc moje pytanie brzmi: jak mam poprawnie interpetować ten kod?
javascript
variable-assignment
conditional-operator
operator-precedence
compound-assignment
Baijs
źródło
źródło
h.className += ' error'
, pozostawia również puste miejsce na początku ciągu, jeśli był początkowo pusty. Uważam, że celem tej trójskładnikowej operacji jest stworzenie czysto wyglądającego ciągu.Pomyśl o tym w ten sposób:
Sposób wykonania instrukcji jest w zasadzie następujący:
<expression>
daje wynik prawda, czy też fałsz?<expression>
zwraca wartość true, to wartość<true clause>
jest przypisywana do<variable>
,<false clause>
jest ignorowana i wykonywana jest następna instrukcja.<expression>
wartość false, to<true clause>
jest ignorowane i<false clause>
przypisywana jest wartość<variable>
.Ważną rzeczą, którą należy sobie uświadomić w przypadku operatora trójskładnikowego w tym i innych językach, jest to, że jakikolwiek kod się znajduje,
<expression>
po ocenie powinien dać wynik boolowski: prawda lub fałsz.W twoim przykładzie zamień „przypisane do” w moim wyjaśnieniu na „dodane do” lub podobnie dla dowolnej skróconej arytmetyki, której używasz, jeśli w ogóle.
źródło
+
mają większy priorytet niż operator warunkowy / trójskładnikowy (w rzeczywistości operator warunkowy jest prawie zawsze ostatnim oceniane w jakimkolwiek wyrażeniu)+=
Robi to, co chcesz, ale w potrójnym oświadczenie na prawicy to, to sprawdza czyh.className
jest falsey, które byłoby, gdyby to było niezdefiniowane. Jeśli jest to prawda (tj. Jeśli nazwa klasy jest już określona), to błąd jest dodawany ze spacją (tj. Dodawanie nowej klasy), w przeciwnym razie jest dodawany bez spacji.Kod można przepisać tak, jak sugerujesz, ale musisz określić, że
h.className
ma być używany do porównania prawdziwości, a nie do używania jego rzeczywistej wartości w operatorze trójskładnikowym, więc upewnij się, że nie zawracasz sobie głowy konkatenacją wartości w tym samym czasie, gdy wykonujesz swoją trójskładnikową operację:źródło
undefined
nie jest fałszywe , jest po prostu traktowane tak, jakby byłoPrawa strona
=
operatora jest oceniana od lewej do prawej. Więc,jest równa
Aby być równoważnym
musisz oddzielić zdanie trójskładnikowe w nawiasach
źródło
powinien być odpowiednikiem:
źródło
Wiem, że to bardzo stare pytanie, ale nie jestem w 100% zadowolony z żadnej z odpowiedzi, ponieważ wszystkie wydają się niekompletne. Więc znowu zaczynamy od pierwszych zleceniodawców:
Ogólny cel użytkownika:
Podsumowując kod: „Chciałbym dodać
error
nazwę klasy do łańcucha, opcjonalnie z początkiem spacji, jeśli w ciągu są już nazwy klas”.Najprostsze rozwiązanie
Jak zauważył Kobi, 5 lat temu posiadanie wiodącej spacji w nazwach klas nie spowoduje żadnych problemów w żadnej ze znanych przeglądarek, więc najkrótszym poprawnym rozwiązaniem byłoby w rzeczywistości:
To powinna być właściwa odpowiedź na rzeczywisty problem .
Tak czy inaczej, zadawano pytania ...
1) Dlaczego to zadziałało?
Operator warunkowy / trójskładnikowy działa jak instrukcja if, która przypisuje wynik swoich ścieżek
true
lubfalse
do zmiennej.Więc ten kod działał, ponieważ jest oceniany po prostu jako:
2) i dlaczego to się zepsuło?
Pytanie brzmi: „to daje [n] błąd w mojej konsoli”, co może wprowadzić Cię w błąd, myśląc, że kod nie działa . W rzeczywistości poniższy kod działa bez błędów , ale po prostu zwraca „błąd”, jeśli ciąg nie był pusty, i „błąd”, jeśli ciąg był pusty, a więc nie spełniał wymagań .
Ten kod zawsze daje w wyniku ciąg, który zawiera tylko
' error'
lub'error'
dlatego, że jest wynikiem tego pseudokodu:Powodem tego jest fakt, że operator dodawania (
+
do zwykłego ludu) ma wyższy „priorytet” (6) niż operator warunkowy / trójskładnikowy (15). Wiem, że liczby pojawiają się wsteczPierwszeństwo oznacza po prostu, że każdy typ operatora w języku jest oceniany w określonej, predefiniowanej kolejności (a nie tylko od lewej do prawej).
Odniesienie: Pierwszeństwo operatorów JavaScript
Jak zmienić kolejność ocen:
Teraz wiemy, dlaczego się nie udaje, musisz wiedzieć, jak to działa.
Inne odpowiedzi mówią o zmianie priorytetu , ale nie możesz . Pierwszeństwo jest na stałe wpisane w język. To tylko ustalony zestaw reguł ... Możesz jednak zmienić kolejność ocen ...
Narzędziem w naszym zestawie narzędzi, które może zmienić kolejność oceny, jest operator grupowania (inaczej nawiasy). Czyni to poprzez zapewnienie, że wyrażenia w nawiasach są oceniane przed operacjami poza nawiasami. To wszystko, co robią, ale to wystarczy.
Nawiasy działają po prostu dlatego, że (operatory grupujące) mają wyższy priorytet niż wszystkie inne operatory („teraz jest poziom 0”).
Po prostu dodając nawiasy, zmieniasz kolejność obliczeń, aby upewnić się, że test warunkowy zostanie wykonany jako pierwszy, przed prostą konkatenacją ciągów:
Zostawię teraz tę odpowiedź niewidoczną wśród innych rdzy :)
źródło
Chciałbym wybrać wyjaśnienie Wayne'a:
Rozważmy oba przypadki:
explanation
podczas gdy przypadek2:
h.className + h.className
=> traktowane jako wyrażenie dla operatora trójskładnikowego, ponieważ operator trójskładnikowy ma wyższy priorytet. więc zawsze przypisywany jest wynik wyrażenia trójskładnikowegoMusisz zdefiniować pierwszeństwo za pomocą nawiasówAby przypadek 2 działał jak przypadek 1, musisz zdefiniować kolejność ocen, które mają być brane pod uwagę, za pomocą nawiasów
źródło