Ich denke, es sollte beachtet werden, dass dabei kein Schaden entstehen könnte h.className += ' error', lässt es auch ein Leerzeichen am Anfang der Zeichenfolge, wenn es ursprünglich leer war. Ich glaube, der Sinn der ternären Operation besteht darin, eine sauber aussehende Saite zu erzeugen.
– JMTyler
21. Juni 2011 um 22:15 Uhr
@JMTyler – Das ist genau das, was ich angedeutet habe – Wenn alles nur getan wird, um von Anfang an einen Platz zu behalten, ist es das nicht wert. (Randfall enthält exakte jQuery- oder XPath-Selektoren). Trotzdem danke.
Die Art und Weise, wie die Anweisung ausgeführt wird, ist im Wesentlichen wie folgt:
Tut <expression> zu wahr auswerten oder zu falsch auswerten?
Wenn <expression> als wahr ausgewertet wird, dann der Wert von <true clause> zugeordnet ist <variable>, <false clause> wird ignoriert und die nächste Anweisung ausgeführt.
Wenn <expression> wertet dann als falsch aus <true clause> wird ignoriert und der Wert von <false clause> zugeordnet ist <variable>.
Das Wichtige, was man mit dem ternären Operator in dieser und anderen Sprachen erkennen muss, ist, dass jeder Code drin ist <expression> sollte bei der Auswertung ein boolesches Ergebnis liefern: entweder wahr oder falsch.
Ersetzen Sie im Fall Ihres Beispiels “zugewiesen zu” in meiner Erklärung durch “hinzugefügt zu” oder ähnliches für die von Ihnen verwendete Kurzformarithmetik, falls vorhanden.
Beachten Sie unbedingt, ob die perfekt Kommentar ist angebracht 🙂 Es überspringt jede Erklärung von warum die linken Ausdrücke zuerst “gruppiert” (dh weil + hat einen höheren Vorrang als der bedingte/ternäre Operator (tatsächlich ist der bedingte Operator fast immer der letzte, der in einem beliebigen Ausdruck ausgewertet wird).
– Weg Codierung
11. Juni 2014 um 14:24 Uhr
Das += tut, was Sie wollen, aber in der ternären Anweisung rechts davon wird überprüft, ob h.className ist falsch, was es wäre, wenn es undefiniert wäre. Wenn es wahr ist (dh wenn bereits ein Klassenname angegeben ist), wird error mit einem Leerzeichen hinzugefügt (dh das Hinzufügen von a Neu Klasse), andernfalls wird es ohne das Leerzeichen hinzugefügt.
Der Code könnte wie von Ihnen vorgeschlagen umgeschrieben werden, aber Sie müssen dies angeben h.className soll für den Wahrheitsvergleich verwendet werden und nicht für die Verwendung seines tatsächlichen Werts im ternären Operator, also stellen Sie sicher, dass Sie sich nicht mit der Verkettung von Werten beschäftigen, während Sie Ihre ternäre Operation durchführen:
h.className + h.className => wird als Ausdruck für den ternären Operator betrachtet, da der ternäre Operator eine höhere Priorität hat. Es wird also immer nur das Ergebnis des ternären Ausdrucks zugewiesen.
Aber ich bin mit keiner der Antworten 100% zufrieden, da sie alle unvollständig erscheinen. Hier gehen wir also wieder von den ersten Prinzipien aus:
Das übergeordnete Ziel des Benutzers:
Zusammenfassen des Codes: „Ich möchte eine hinzufügen error Klassennamen in einen String, optional mit führendem Leerzeichen, wenn der String bereits Klassennamen enthält.”
Einfachste Lösung
Wie Kobi vor fünf Jahren betonte, wird ein führendes Leerzeichen in Klassennamen keine Probleme mit bekannten Browsern verursachen, daher wäre die kürzeste richtige Lösung tatsächlich:
h.className += ' error';
Das soll die gewesen sein tatsächliche Antwort zum eigentliches Problem.
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 ein wenn Anweisung, die das Ergebnis seiner zuweist true oder false Pfade zu einer Variablen.
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'
Die Frage lautet: „Das gibt a[n] Fehler in meiner Konsole”, was Sie dazu verleiten könnte, den Code zu denken funktioniert nicht. Tatsächlich läuft der folgende Code ohne Erroraber es gibt einfach ‘ error ‘ zurück, wenn die Zeichenfolge war nicht leer und ‘Fehler’ wenn die Zeichenfolge war leer und so entsprach nicht den Anforderungen.
Dieser Code führt immer zu einer Zeichenfolge, die nur enthält ' error' oder 'error' weil es zu diesem Pseudocode ausgewertet wird:
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 gemeine Volk) hat eine höhere “Präzedenz” (6) 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 ausgewertet wird (und nicht nur von links nach rechts).
Jetzt wissen wir, warum es fehlschlägt, Sie müssen wissen, wie es funktioniert.
Einige andere Antworten sprechen darüber Vorrang ändernaber du kannst nicht. Vorrang ist in der Sprache fest verdrahtet. Das ist nur ein festes Regelwerk… Du kannst das aber ändern Reihenfolge der Auswertung…
Das Tool in unserer Toolbox, das kann Reihenfolge der Auswertung ändern ist der Gruppierungsoperator (auch bekannt als Klammern). Dies geschieht, indem sichergestellt wird, dass die Ausdrücke in den Klammern ausgewertet werden Vor Operationen außerhalb der Klammern. Das ist alles, was sie tun, aber das ist genug.
Klammern funktionieren einfach, weil sie (Gruppierungsoperatoren) haben Vorrang vor allen anderen Operatoren (“es gibt jetzt eine Stufe 0”).
Indem Sie einfach Klammern hinzufügen Reihenfolge der Auswertung ändern um sicherzustellen, dass der bedingte Test zuerst durchgeführt wird, bevor die einfache Zeichenfolgenverkettung erfolgt: