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:
h.className += ' error';
To powinna być właściwa odpowiedź na rzeczywisty problem .
Tak czy inaczej, zadawano pytania ...
1) Dlaczego to zadziałało?
h.className += h.className ? ' error' : 'error'
Operator warunkowy / trójskładnikowy działa jak instrukcja if, która przypisuje wynik swoich ścieżek true
lub false
do zmiennej.
Więc ten kod działał, ponieważ jest oceniany po prostu jako:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) i dlaczego to się zepsuło?
h.className = h.className + h.className ? ' error' : 'error'
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:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
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ę wstecz
Pierwszeń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).
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:
h.className = h.className + (h.className ? ' error' : 'error')
Zostawię teraz tę odpowiedź niewidoczną wśród innych rdzy :)
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.