Ich weiß, dass dies eine sehr alte Frage ist, aber ich bin mit keiner der Antworten 100% zufrieden, da sie alle unvollständig erscheinen. Also los geht's wieder von den ersten Prinzipien:
Das übergeordnete Ziel des Benutzers:
Zusammenfassend: "Ich möchte error
einer Zeichenfolge einen Klassennamen hinzufügen , optional mit einem führenden Leerzeichen, wenn die Zeichenfolge bereits Klassennamen enthält."
Einfachste Lösung
Wie Kobi vor 5 Jahren betonte, verursacht ein führender Platz in Klassennamen keine Probleme mit bekannten Browsern. Die kürzeste richtige Lösung wäre also tatsächlich:
h.className += ' error';
Das hätte die eigentliche Antwort auf das eigentliche Problem sein sollen .
Wie dem auch sei, die gestellten Fragen waren ...
1) Warum hat das funktioniert?
h.className += h.className ? ' error' : 'error'
Der bedingte / ternäre Operator funktioniert wie eine if-Anweisung, die das Ergebnis seiner true
oder seiner false
Pfade einer Variablen zuweist .
Dieser Code hat also funktioniert, weil er einfach wie folgt ausgewertet wird:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) und warum ist das kaputt gegangen?
h.className = h.className + h.className ? ' error' : 'error'
Die Frage lautet "das gibt einen [n] Fehler in meiner Konsole", was Sie irreführen könnte, zu glauben, dass der Code nicht funktioniert . In der Tat ist der folgende Code ausgeführt werden , ohne Fehler , aber es gibt einfach ‚Fehler‘ , wenn die Zeichenfolge nicht war leer und ‚Fehler‘ , wenn die Zeichenfolge war leer und so nicht den Anforderungen entsprechen .
Dieser Code führt immer zu einer Zeichenfolge, die nur enthält ' error'
oder 'error'
weil er diesen Pseudocode auswertet:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
Der Grund dafür ist, dass der Additionsoperator ( +
für das allgemeine Volk) eine höhere "Priorität" (6) hat als der bedingte / ternäre Operator (15). Ich weiß, dass die Zahlen rückwärts erscheinen
Vorrang bedeutet einfach, dass jeder Operatortyp in einer Sprache in einer bestimmten vordefinierten Reihenfolge (und nicht nur von links nach rechts) ausgewertet wird.
So ändern Sie die Reihenfolge der Bewertung:
Jetzt wissen wir, warum es fehlschlägt. Sie müssen wissen, wie es funktioniert.
Einige andere Antworten sprechen davon , die Priorität zu ändern , aber Sie können nicht . Der Vorrang ist fest mit der Sprache verbunden. Das ist nur ein festes Regelwerk ... Sie können jedoch die Reihenfolge der Auswertung ändern ...
Das Tool in unserer Toolbox, das die Reihenfolge der Auswertung ändern kann , ist der Gruppierungsoperator (auch als Klammern bezeichnet). Dazu wird sichergestellt, dass die Ausdrücke in den Klammern vor Operationen außerhalb der Klammern ausgewertet werden . Das ist alles was sie tun, aber das ist genug.
Klammern funktionieren einfach, weil sie (Gruppierungsoperatoren) eine höhere Priorität haben als alle anderen Operatoren ("es gibt jetzt eine Stufe 0").
Durch einfaches Hinzufügen von Klammern ändern Sie die Reihenfolge der Auswertung, um sicherzustellen, dass der bedingte Test zuerst durchgeführt wird, bevor die einfache Verkettung von Zeichenfolgen erfolgt:
h.className = h.className + (h.className ? ' error' : 'error')
Ich werde diese Antwort jetzt ungesehen unter den anderen rosten lassen :)
h.className += ' error'
, es auch ein Leerzeichen am Anfang der Zeichenfolge hinterlässt, wenn es anfangs leer war. Ich glaube, der Sinn der ternären Operation besteht darin, eine sauber aussehende Saite zu erzeugen.