So che questa è una domanda molto vecchia, ma non sono soddisfatto al 100% di nessuna delle risposte poiché sembrano tutte incomplete. Quindi eccoci di nuovo dai primi presidi:
L'obiettivo generale dell'utente:
Riassumendo il codice: "Desidero aggiungere un error
nome di classe a una stringa, opzionalmente con uno spazio iniziale se nella stringa sono già presenti nomi di classe."
La soluzione più semplice
Come ha sottolineato Kobi, 5 anni fa, avere uno spazio principale nei nomi delle classi non causerà alcun problema con nessun browser noto, quindi la soluzione corretta più breve sarebbe in realtà:
h.className += ' error';
Questa avrebbe dovuto essere la risposta effettiva al problema reale .
Comunque sia, le domande poste erano ...
1) Perché ha funzionato?
h.className += h.className ? ' error' : 'error'
L'operatore condizionale / ternario funziona come un'istruzione if, che assegna il risultato dei suoi percorsi true
o false
a una variabile.
Quindi quel codice ha funzionato perché viene valutato semplicemente come:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) e perché questa rottura?
h.className = h.className + h.className ? ' error' : 'error'
La domanda afferma "che dà un [n] errore nella mia console", il che potrebbe indurti a pensare che il codice non funzioni . Infatti il codice seguente viene eseguito, senza errori , ma restituisce semplicemente "errore" se la stringa non era vuota e "errore" se la stringa era vuota e quindi non soddisfaceva i requisiti .
Quel codice risulta sempre in una stringa che contiene solo ' error'
o 'error'
perché restituisce questo pseudo codice:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
La ragione di ciò è che l'operatore di addizione ( +
alla gente comune) ha una "precedenza" (6) maggiore dell'operatore condizionale / ternario (15). So che i numeri appaiono al contrario
Precedenza significa semplicemente che ogni tipo di operatore in una lingua viene valutato in un particolare ordine predefinito (e non solo da sinistra a destra).
Come modificare l'ordine di valutazione:
Ora sappiamo perché fallisce, devi sapere come farlo funzionare.
Alcune altre risposte parlano di cambiare la precedenza , ma non puoi . La precedenza è cablata nella lingua. Questo è solo un insieme fisso di regole ... Tuttavia, puoi cambiare l' ordine di valutazione ...
Lo strumento nella nostra casella degli strumenti che può cambiare l'ordine di valutazione è l'operatore di raggruppamento (noto anche come parentesi). Lo fa assicurandosi che le espressioni tra parentesi siano valutate prima delle operazioni al di fuori delle parentesi. È tutto quello che fanno, ma è abbastanza.
Le parentesi funzionano semplicemente perché (operatori di raggruppamento) hanno una precedenza maggiore rispetto a tutti gli altri operatori ("ora c'è un livello 0").
Aggiungendo semplicemente parentesi si modifica l'ordine di valutazione per garantire che il test condizionale venga eseguito prima, prima della semplice concatenazione di stringhe:
h.className = h.className + (h.className ? ' error' : 'error')
Ora lascerò questa risposta alla ruggine invisibile tra le altre :)
h.className += ' error'
, lascia anche uno spazio vuoto all'inizio della stringa se inizialmente era vuoto. Credo che lo scopo dell'operazione ternaria sia produrre una corda dall'aspetto pulito.