Vor einigen Monaten war ich auf Hacker News (wie man das eben so macht) und stieß auf einen (inzwischen gelöschten) Artikel darüber, keine if-Anweisungen zu verwenden. Wenn Sie neu in dieser Idee sind (so wie ich es war), dann erwartet Sie ein echtes Vergnügen. Suchen Sie einfach nach „if statements“ auf Hacker News. Sie werden Artikel finden, die vorschlagen, dass Sie sie vielleicht nicht brauchen, Artikel, die sie als Code Smell bezeichnen und sogar den Quintessenz-„considered harmful“. Hören Sie, Sie wissen, dass ein Programmierkonzept legitim ist, wenn Leute vorschlagen, dass dessen Verwendung jemanden tatsächlich verletzen wird.

Und wenn Ihnen das nicht genug ist, gibt es immer noch die „Anti-If Campaign“. Wenn Sie beitreten, erhalten Sie ein schickes Banner und Ihren Namen auf der Website. WENN Sie beitreten. Oh, die süße, süße Ironie.
Als ich dieses bizarre „if-Anathema-Phänomen“ zum ersten Mal bemerkte, fand ich es interessant, aber wahrscheinlich nur weitere Leute, die sich im Internet aufregen. Man ist immer nur eine Google-Suche davon entfernt, jemanden zu finden, der sich über irgendetwas aufregt. Wie zum Beispiel diese Person, die Kätzchen hasst. KÄTZCHEN.
Einige Zeit später sah ich mir Linus Torvalds‘ TED-Interview an. In diesem Interview zeigt er zwei Folien. Die erste Folie enthält Code, den er als „schlechten Geschmack“ bezeichnet.

Und die zweite ist derselbe Code, aber in dem, was Linus als „guten Geschmack“ betrachten würde.

Ich erkenne an, dass Linus eine etwas polarisierende Figur ist und Sie vielleicht nicht mit der Formulierung „guter Geschmack“ vs. „schlechter Geschmack“ einverstanden sind. Aber ich denke, wir können uns universell darauf einigen, dass die zweite Folie einfach angenehmer für die Augen ist. Sie ist prägnant, hat weniger logische Pfade zu verfolgen und enthält keine if-Anweisung. Ich möchte, dass mein Code so aussieht. Es muss kein genialer Algorithmus sein (wird er nie sein), aber ich denke, er kann sauber sein, und erinnern Sie sich, was Billy Corgan von Smashing Pumpkins über Sauberkeit gesagt hat…
Sauberkeit ist Göttlichkeit. Und Gott ist leer. Genau wie ich.
– Billy Corgan, „Zero“
So düster! Aber was für ein erstaunliches Album.
Abgesehen davon, dass Ihr Code unübersichtlich aussieht, erfordern if-Anweisungen oder „Branching Logic“ (Verzweigungslogik), dass Ihr Gehirn zwei separate Pfade gleichzeitig zusammen mit allen Dingen, die auf diesen Pfaden auftreten könnten, im Gedächtnis behält und auswertet. Wenn Sie if-Anweisungen verschachteln, verschärft sich das Problem, da Sie einen Entscheidungsbaum erstellen und verfolgen, und Ihr Gehirn muss wie ein betrunkener Affe über diesen Baum hüpfen. Diese Art von Dingen macht Code schwer lesbar. Und denken Sie daran, Sie sollten Ihren Code so schreiben, dass Sie an den Idioten denken, der danach kommt und ihn warten muss. Und dieser Idiot sind wahrscheinlich Sie.
Als mein eigener Lieblingsidiot bemühe ich mich in letzter Zeit bewusst darum, if-Anweisungen in meinem JavaScript zu vermeiden. Das gelingt mir nicht immer, aber zumindest zwingt es mich, über die Lösung des Problems aus einem völlig anderen Blickwinkel nachzudenken. Es macht mich zu einem besseren Entwickler, weil es mich zwingt, einen Teil meines Gehirns zu aktivieren, der sonst auf einem Sitzsack sitzt und Erdnuss-M&Ms isst, während die if-Anweisung die ganze Arbeit macht.
Bei dem Versuch, keine if-Anweisungen zu schreiben, habe ich meine Liebe dafür entdeckt, wie JavaScript es Ihnen ermöglicht, bedingte Logik mit ternären Anweisungen und logischen Operatoren zu komponieren. Was ich Ihnen jetzt vorschlagen möchte, ist, dass das Ternary ein schlechtes Ansehen bekommen hat und Sie es zusammen mit den Operatoren && und || verwenden können, um ziemlich prägnanten und lesbaren Code zu schreiben.
Das vielgeschmähte Ternary
Als ich anfing, als Programmierer zu arbeiten, sagten die Leute: „Benutze niemals ein Ternary. Sie sind zu kompliziert.“ Also habe ich sie nicht benutzt. Niemals. Ich habe nie ein Ternary benutzt. Ich habe nie einmal die Mühe unternommen zu hinterfragen, ob diese Leute richtig lagen oder nicht.
Ich glaube nicht, dass sie richtig lagen.
Ternaries sind nur einzeilige if-Anweisungen. Zu behaupten, sie seien in irgendeiner Form implizit zu kompliziert, ist einfach… nicht wahr. Ich meine, ich bin nicht der kühlste Donut in der Schachtel, aber ich habe überhaupt keine Probleme, ein einfaches Ternary zu verstehen. Ist es möglich, dass wir uns hier nur ein wenig selbst infantilisieren, wenn wir sagen, sie immer zu vermeiden? Ich denke, ein gut strukturiertes Ternary schlägt eine if-Anweisung jedes Mal.
Nehmen wir ein einfaches Beispiel. Sagen wir, wir haben eine Anwendung, in der wir testen wollen, ob der Benutzer angemeldet ist. Wenn er es ist, schicken wir ihn auf seine Profilseite. Andernfalls schicken wir ihn auf die Startseite. Hier ist die Standard-if-Anweisung, um das zu tun…
if (isLogggedIn) {
navigateTo('profile');
}
else {
navigateTo('unauthorized');
}
Das ist eine verdammt einfache Operation, die sich über sechs Zeilen erstreckt. SECHS ZEILEN. Denken Sie daran, dass Sie bei jeder Zeile Code, die Sie durchlaufen, an den Code oberhalb denken und daran, wie er den Code unterhalb beeinflusst.
Nun die ternäre Version…
isLoggedIn ? navigateTo('profile') : navigateTo('unauthorized');
Ihr Gehirn muss hier nur eine Zeile auswerten, nicht sechs. Sie müssen nicht zwischen Zeilen wechseln und sich merken, was auf der vorherigen Zeile stand.
Ein Nachteil des Ternary ist jedoch, dass Sie nicht nur für eine Bedingung auswerten können. Basierend auf dem vorherigen Beispiel, wenn Sie zur Profilseite navigieren möchten, wenn der Benutzer angemeldet ist, aber überhaupt keine Aktion ausführen, wenn er es nicht ist, funktioniert das hier nicht…
// !! Doesn't Compile !!
logggedIn ? navigateTo('profile')
Hier müssten Sie eine tatsächliche if-Anweisung schreiben. Oder etwa nicht?
Es gibt einen Trick, den Sie in JavaScript verwenden können, wenn Sie nur eine Seite der Bedingung auswerten möchten und keine if-Anweisung verwenden wollen. Das tun Sie, indem Sie die Funktionsweise von JavaScript mit den Operatoren || (oder) und && (und) nutzen.
loggedIn && navigateTo('profile');
Wie funktioniert das!?
Was wir hier tun, ist, JavaScript zu fragen: „Sind beide Dinge wahr?“ Wenn der erste Punkt falsch ist, gibt es keinen Grund für die JavaScript-Virtual-Machine, den zweiten auszuführen. Wir wissen bereits, dass nicht beide wahr sind, da einer von ihnen falsch ist. Wir nutzen die Tatsache aus, dass JavaScript sich nicht darum kümmert, den zweiten Punkt auszuwerten, wenn der erste falsch ist. Das ist gleichbedeutend mit der Aussage: „Wenn die erste Bedingung wahr ist, führe die zweite aus.“
Was, wenn wir das nun umdrehen wollen? Was, wenn wir nur zur Profilseite navigieren wollen, wenn der Benutzer **nicht** angemeldet ist? Sie könnten einfach ein ! vor die Variable loggedIn setzen, aber es gibt noch einen anderen Weg.
loggedIn || navigateTo('profile');
Das besagt: „Ist eines von beiden wahr?“ Wenn das erste falsch ist, muss es das zweite auswerten, um sicher zu sein. Wenn das erste jedoch wahr ist, wird das zweite niemals ausgeführt, da es bereits weiß, dass eines von beiden wahr ist; daher ist die gesamte Anweisung wahr.
Nun, ist das besser, als einfach das zu tun?
if (!loggedIn) navigateTo('profile');
Nein. In dieser Form nicht. Aber hier ist die Sache: Sobald Sie wissen, dass Sie die Operatoren && und || verwenden können, um Gleichheit außerhalb von if-Anweisungen auszuwerten, können Sie sie verwenden, um Ihren Code erheblich zu vereinfachen.
Hier ist ein komplexeres Beispiel. Sagen wir, wir haben eine Login-Funktion, an die wir ein Benutzerobjekt übergeben. Dieses Objekt kann null sein, also müssen wir den lokalen Speicher überprüfen, ob der Benutzer dort eine gespeicherte Sitzung hat. Wenn ja und wenn es sich um einen Administrator handelt, leiten wir ihn zu einem Dashboard. Andernfalls senden wir ihn zu einer Seite, die ihm mitteilt, dass er nicht autorisiert ist. Hier ist, wie das als einfache if-Anweisung aussieht.
function login(user) {
if (!user) {
user = getFromLocalStorage('user');
}
if (user) {
if (user.loggedIn && user.isAdmin) {
navigateTo('dashboard');
}
else {
navigateTo('unauthorized');
}
}
else {
navigateTo('unauthorized');
}
}
Autsch. Das ist kompliziert, weil wir viele Null-Bedingungsprüfungen auf dem user-Objekt durchführen. Ich möchte diesen Beitrag nicht zu sehr wie einen Strohmann gestalten, also vereinfachen wir das, da hier viel redundanter Code vorhanden ist, den wir wahrscheinlich in andere Funktionen refaktorieren würden.
function checkUser(user) {
if (!user) {
user = getFromLocalStorage('user');
}
return user;
}
function checkAdmin(user) {
if (user.isLoggedIn && user.isAdmin) {
navigateTo('dashboard');
}
else {
navigateTo('unauthorized');
}
}
function login(user) {
if (checkUser(user)) {
checkAdmin(user);
}
else {
navigateTo('unauthorized');
}
}
Die Hauptlogin-Funktion ist einfacher, aber das ist tatsächlich mehr Code und nicht unbedingt „sauberer“, wenn man das Ganze betrachtet und nicht nur die login-Funktion.
Ich möchte vorschlagen, dass wir all dies in zwei Zeilen erledigen können, wenn wir auf if-Anweisungen verzichten, das Ternary annehmen und logische Operatoren verwenden, um die Gleichheit zu bestimmen.
function login(user) {
user = user || getFromLocalStorage('user');
user && (user.loggedIn && user.isAdmin) ? navigateTo('dashboard') : navigateTo('unauthorized')
}
Das ist alles. All dieser Lärm, der von if-Anweisungen erzeugt wird, kollabiert auf zwei Zeilen. Wenn die zweite Zeile für Sie etwas lang und unleserlich wirkt, wickeln Sie sie so um, dass die Bedingungen auf einer eigenen Zeile stehen.
function login(user) {
user = user || getFromLocalStorage("user");
user && (user.loggedIn && user.isAdmin)
? navigateTo("dashboard")
: navigateTo("unauthorized");
}
Wenn Sie sich Sorgen machen, dass die nächste Person nicht weiß, wie die Operatoren && und || in JavaScript funktionieren, fügen Sie einige Kommentare, etwas Weißraum und einen glücklichen Baum hinzu. Entfesseln Sie Ihren inneren Bob Ross.
function login(user) {
// if the user is null, check local storage to
// see if there is a saved user object there
user = user || getFromLocalStorage("user");
// Make sure the user is not null, and is also
// both logged in and an admin. Otherwise, DENIED. 🌲
user && (user.loggedIn && user.isAdmin)
? navigateTo("dashboard")
: navigateTo("unauthorized");
}
Andere Dinge, die Sie tun können
Wo wir gerade dabei sind, hier sind einige andere Tricks, die Sie mit JavaScript-Bedingungen anstellen können.
Zuweisung
Einer meiner Lieblingstricks (den ich oben verwendet habe) ist eine Einzeiler, um zu prüfen, ob ein Element null ist, und es dann neu zuzuweisen, wenn es das ist. Das tun Sie mit einem ||-Operator.
user = user || getFromLocalStorage('user');
Und Sie können so weitermachen bis ins Unendliche…
user = user || getFromLocalStorage('user') || await getFromDatabase('user') || new User();
Das funktioniert auch mit dem Ternary…
user = user ? getFromLocalStorage('user') : new User();
Mehrere Bedingungen
Sie können mehrere Bedingungen an ein Ternary übergeben. Wenn wir zum Beispiel protokollieren wollen, dass der Benutzer sich angemeldet hat, und dann navigieren, können wir das tun, ohne all das in eine andere Funktion abstrahieren zu müssen. Wickeln Sie es in Klammern und fügen Sie ein Komma hinzu.
isLoggedIn ? (log('Logged In'), navigateTo('dashboard')) : navigateTo('unauthorized');
Das funktioniert auch mit Ihren && und || Operatoren…
isLoggedIn && (log('Logged In'), navigateTo('dashboard'));
Verschachtelung von ternären Ausdrücken
Sie können Ihre ternären Ausdrücke verschachteln. In seinem exzellenten Artikel über Ternary demonstriert Eric Elliot dies mit dem folgenden Beispiel…
const withTernary = ({
conditionA, conditionB
}) => (
(!conditionA)
? valueC
: (conditionB)
? valueA
: valueB
);
Das Interessanteste, was Eric dort tut, ist die Negation der ersten Bedingung, damit Sie nicht am Ende Fragezeichen und Doppelpunkte nebeneinander haben, was die Lesbarkeit erschwert. Ich würde das noch einen Schritt weiter gehen und etwas Einrückung hinzufügen. Ich habe auch die geschweiften Klammern und ein explizites Return hinzugefügt, weil das Sehen einer Klammer und dann sofort einer weiteren mein Gehirn dazu bringt, eine Funktionsaufrufung zu erwarten, die nie kommt.
const withTernary = ({ conditionA, conditionB }) => {
return (
(!conditionA)
? valueC
: (conditionB)
? valueA
: valueB
)
}
Als allgemeine Regel denke ich, dass Sie in Erwägung ziehen sollten, Ternaries oder if-Anweisungen nicht zu verschachteln. Jeder der obigen Artikel auf Hacker News wird Sie zu derselben Schlussfolgerung bringen. Obwohl ich Sie nicht beschämen will, sondern nur vorschlagen, dass Sie sich vielleicht (und nur vielleicht) später selbst danken werden, wenn Sie es nicht tun.
Das ist mein Plädoyer für das missverstandene Ternary und logische Operatoren. Ich denke, sie helfen Ihnen, sauberen, lesbaren Code zu schreiben und if-Anweisungen komplett zu vermeiden. Nun, wenn wir Linus Torvalds dazu bringen könnten, all dies als „guten Geschmack“ zu genehmigen. Ich könnte früh in Rente gehen und den Rest meines Lebens in Frieden leben.
Eines, das ich an Ternaries liebe, ist, dass sie Ausdrücke und keine Anweisungen sind, und als solche können sie nur auf einen Teil einer Anweisung angewendet werden. So kann das erste Beispiel weiter vereinfacht werden als
navigateTo(isLoggedIn ? 'profile' : 'unauthorized').WOW! Das ist verdammt erstaunlich! Ich wusste nicht, dass man das tun kann.
Noki Doki: Danke! Ich dachte mir dasselbe!
Der ternäre Operator ist ein OPERATOR, keine Kontrollanweisung! Er sollte verwendet werden, um einen Wert auszuwählen, nicht eine Aktion!
Anwendungsfälle
1. Führen Sie dieselbe Aktion aus, aber mit unterschiedlichen Werten (Beispiel von Noki Doki)
2. Initialisieren Sie eine Variable, insbesondere eine Konstante (Beispiel von Christopher Kirk-Nielsen)
Ja, das ist eigentlich die bessere Art, diese Zeile zu schreiben, meiner Meinung nach.
Tatsächlich verbieten einige Stilrichtlinien / Linting-Regelsätze eigenständige ternäre Ausdrücke, die nicht Teil einer Anweisung oder Zuweisung sind.
Ich liebe Ternaries für Variablendeklarationen wie
var togglerIsOpen = el.hasAttribute('open') ? true : false(dummes Beispiel, das nicht einmal das Ternary benötigt, aber Sie verstehen den Punkt). Ich habe auch verschachtelte Ternaries wie in Ihrem letzten Beispiel geschrieben. Ich benutze es streng für kurze Variablendeklarationen, während ich versuche, die Unveränderlichkeit zu respektieren. Solange es nicht zu kompliziert ist, bin ich dafür.Wo ich Ihrem Beitrag nicht zustimme, ist der Ansatz „kürzerer Code ist einfacher“, wie dieser
isLoggedIn && (log('Logged In'), navigateTo('dashboard'));. Das ist nicht leicht zu lesen, und jemand, der mit der Short-Circuiting-Funktion nicht vertraut ist, würde sehr leicht verloren gehen (ich weiß, dass ich es wäre). Ein bedingter Block ist vielleicht länger, aber für mich ist er so, so viel einfacher zu lesen, aufzuteilen und zu verdauen. Sie haben einen klaren Überblick darüber, was passiert und warum, jeder kann es lesen, und Sie können Bedingungen/Operationen hinzufügen, ohne sich zu fragen, ob das Ganze noch funktionieren wird.Ich denke, es ist großartig, Wege zu kennen, um Code zu verkürzen, der immer noch gleich funktioniert, aber ich überlasse das Minifiern. Ich kann mir vorstellen, dass dies für Code-Golf super nützlich wäre!
Ich schätze, wie immer, es läuft auf persönliche Vorliebe hinaus. Bin immer noch froh, ein paar Dinge aus diesem Beitrag gelernt zu haben, also danke! :)
PS: Im Abschnitt „Assignments“ über
||(den ich auch gerne benutze!) liefert das Ternary nicht dasselbe Ergebnis wie die darüber stehende||-Zeile. Ich glaube, es sollteuser = user ? user : getFromLocalStorage('user') ? getFromLocalStorage('user') : new User();sein, oder? — nicht so prägnant, aber.Guter Fang! Danke.
Ich stimme dem zu, in dem Sinne, dass prägnanterer Code nicht dasselbe ist wie besserer Code. Ich hatte mehr Erfolg dabei, Code lesbar zu machen, indem ich bei Bedarf frühzeitig aussteige.
Davon abgesehen bin ich ein großer Fan davon, Ternaries zu verwenden, um Anfangswerte wie in den Beispielen festzulegen.
Größte Erkenntnis? Hinterfragen Sie immer und verwenden Sie das richtige Werkzeug für die Aufgabe. Ifs haben ihren Platz und so auch Ternaries.
Ich habe gerade diesen Artikel gefunden und bemerkt, dass Sie immer noch diese Zeile
user = user ? getFromLocalStorage('user') : new User();nicht korrigiert haben, was mich eine ganze Minute lang innehalten ließ, als ich sie sah.Solange wir doppelte Aufrufe machen, um nur Ternaries zu verwenden, wäre die vollständige Konvertierung
user = user ? user : getFromLocalStorage('user') ? getFromLocalStorage('user') : await getFromDatabase('user') ? await getFromDatabase('user') : new User();, richtig?In Ihrem isLoggedIn-Beispiel würde ich es viel vorziehen, das Ternary zu verwenden, um ein Ziel zuzuweisen, und dann die Navigation durchzuführen, da dies die Aktion von der Logik trennt, die die Bedingungen um die Aktion herum bestimmt. Daher
Jedes ist natürlich weitaus besser als die
if... else...-Konstruktion. Danke für den Artikel!Ich bin ein Fan von Ternaries, daher stimme ich all dem zu. Weniger Code ist besser.
Eine Sache, auf die man achten sollte, ist die Prüfung auf null
jim = jim || „default value“
Das sollte man vermeiden, wenn jim eine Zahl oder ein Boolean sein könnte (glaube ich). Oder irgendetwas, das gültig, aber falsch sein könnte.
Richtig, das erfasst alle 7 falschen Werte in JS: null, undefined, false, +0, -0, NaN und der leere String
Guter Punkt! Obwohl das eine Problem, das ich mit Typen habe, ist, dass ich sie einfach nie antreffe. Sie scheinen eher hypothetisch als real zu sein. Das ist mein Hauptproblem mit typisierten Sprachen. Für mich fühlt es sich ein bisschen wie ein Prepper an.
Interessante Lektüre. Ich stimme dem Punkt jedoch nicht zu.
Wie bereits in einem früheren Kommentar erwähnt, bedeutet kürzerer Code nicht gleich besser lesbarer Code.
Nur weil man etwas tun kann, heißt das nicht, dass man es immer tun sollte oder dass es eine gute Idee ist. Dieses Beispiel, bei dem die Komma-Ausdrücke verwendet werden, ist meiner Meinung nach einfach bösartiger Rat.
Man kann selten sagen, dass eine Art zu codieren besser ist als eine andere. Meistens muss man sich zwischen mehreren Optionen entscheiden und dabei die Kompromisse jeder Option für das jeweilige Szenario berücksichtigen. Und ich denke, der Fall ternärer Ausdrücke vs. if-Anweisungen ist ein gutes Beispiel dafür.
Zuletzt, IMHO, dieser Code
ist in jeder Hinsicht leichter zu lesen und zu befolgen als dieser
Ja – er ist für sich genommen leichter zu lesen. Wenn Sie eine Datei voller dieser haben, ist das nicht so lustig anzusehen.
Ich stimme diesem letzten Punkt nicht zu. Der erste Block ist leichter zu lesen. Das Problem ist, dass er die anderen Blöcke benötigt, um zu funktionieren, sodass man, um die vollständige Logik und alle möglichen Nebeneffekte zu verstehen, den Kontext wechseln und die Verzweigungslogik behandeln muss. Für mich ist das schwieriger, als alles direkt vor mir zu haben.
Zustimmung, obwohl ich eine Änderung an Ihrem Beispiel vornehmen würde. Ich finde es besser, nach positiven Dingen zu suchen, anstatt nach negativen.
Das hat auch den Vorteil, dass es standardmäßig fehlschlägt, was Sie vor einem Fehler schützt, der den Zugriff zulassen könnte, obwohl er es nicht sollte.
Danke, Brad! Das gefällt mir auch besser.
@Brad, als Sie zu „positiven“ Prüfungen wechselten, haben Sie vergessen, || wieder zu && zu ändern
Ich habe gelernt, dass das Ternary eine gute Wahl ist, wenn die Anweisung in eine Zeile passt (weniger als 81 Zeichen) und habe es entsprechend verwendet.
Bedeutet das, dass all dieser Anti-If-Lärm, den ich in letzter Zeit bemerkt habe, wirklich nur um Stil geht und nicht darum, ‚if‘ im logischen Sinne zu vermeiden? WTF? Fühlt sich an wie hin und her geführte Modegespräche.
Ich denke, das sind alles heiße Takes. Sie können diesen Artikel als weiteren heißen Take betrachten.
Nur weil Sie es *können*, heißt das nicht, dass Sie es *sollten*. Es gibt Zeiten, in denen Ternaries großartig sind, aber außerhalb von sehr einfachen Fällen wie Variablendeklarationen machen sie den Code sehr schnell viel weniger lesbar. Code-Lesbarkeit, für sich selbst, für Kollegen, für andere Benutzer Ihres Codes, ist unendlich wichtiger, als sich schlau zu fühlen, weil man etwas knappe und gut aussehende geschrieben hat.
Ich stimme zu, dass große if-Anweisungen und viele abweichende Pfade unangenehm anzusehen sein können, aber das ist der Punkt, an dem Sie einen Schritt zurücktreten und sorgfältiger über die logischen Pfade in Ihrem Code nachdenken, nicht Hals über Kopf etwas Verwirrenderes verfolgen, nur weil es sofort ästhetisch ansprechender ist.
Sehr wahr.
Ich vermute, es ist wie ein Pendel. Irgendwo in der Mitte gibt es ein Gleichgewicht. Aus irgendeinem Grund schwingen wir drastisch in die eine oder andere Richtung.
Toller Artikel. Nur eine Sache
Der richtige Code für withTernary (der für mich funktionierte) ist
Ebenso Zuweisung
…
x && (y=2);
Seien Sie sich bewusst, und ich kann es nicht genug betonen, dass Sie logische Operatoren nicht so verwenden sollten, wenn falsche Werte gültige sind
Wenn
if-Anweisungen entmutigt werden sollen, sollten wir uns in Richtung logischerer und fortgeschrittenerer Programmierkonstrukte bewegen, anstatt alten Wein in neuen Flaschen abzufüllen.Das stimmt! Du hast Recht. Ein Ternary ist kein Ersatz für eine Bedingung, weil es eine ist.
Die
if-Schämer werden hinter mir her sein! Sagen Sie meiner Frau und meinen Kindern, dass ich sie liebe.„Sie können mehrere Bedingungen an ein Ternary übergeben.“ Das war mir nicht bewusst. Mein Standard war immer, es in eine if-Anweisung zu verschieben, wenn das Ternary mehr als eine Sache tun musste. Die Klammern und das Komma sind ein Game-Changer. Toller Tipp und toller Artikel, danke!
Schön! Ehrlich gesagt, das wusste ich auch nicht, bis ich mit der Recherche für diesen Artikel begann.
Ich finde verschachtelte Ternaries leichter zu lesen, wenn man sie wie
if-Anweisungen formatiertIch stimme allem zu, was Sie über Ternaries gesagt haben, aber ich mag es nicht, die Auswertung von Ausdrücken nur wegen der Nebeneffekte zu nutzen. Also
Bevorzugt
Mag nicht
Das 2. Beispiel ist ein Ausdruck, der rein sein sollte und keine Nebeneffekte verursachen sollte.
Anweisungen, wie eigenständige Funktionsaufrufe oder Zuweisungen, werden *wegen* ihrer Effekte ausgeführt.
Danke für den Artikel! Es ist eine tolle Lektüre! Da wir in den obigen Beispielen nur Objekte und Funktionen verwendet haben, wäre es großartig, wenn wir auch die Abstraktion von Bedingungen in Arrays mit praktischen Methoden wie
Array.prototype.some()undArray.prototype.every()beleuchten und Ternaries darin verwenden würden. Das wäre eine großartige Ergänzung zu diesem Artikel! :)Funktionieren diese großartigen Tricks nur mit JS?
Ich habe diesen Artikel wirklich genossen.
Ich finde den Code sauber und elegant.
Es ist sehr wichtig, die Kommentare zu lesen, sonst verpasst man die Beiträge von Noki Doki und Kirk-Nielsen, wie sie von Matt Seitz in zwei Hauptschlussfolgerungen zusammengefasst werden.
Es wäre also großartig, wenn der Artikel aktualisiert und die vorgeschlagenen Verbesserungen aufgenommen würden, und ihnen für ihre Beiträge gedankt würde.
Vielen Dank an alle.
Ich möchte darauf hinweisen, dass || nicht prüft, ob ein Element null ist. Stattdessen prüft es, ob ein Element wahrheitsgemäß ist. Das ist ein sehr wichtiger Punkt, den man beachten sollte
var item = 0;
item = item || 1;
console.log(item); // -> 1
„Einer der Nachteile des Ternary ist jedoch, dass Sie nicht nur für eine Bedingung auswerten können.“
was auch einfach sein könnte
logggedIn ? navigateTo(‘profile’) : null;
Das ist definitiv weniger wünschenswert, als einfach
if (loggedIn) navigateTo('profile')zu schreiben.Es vermeidet das
if-Statement nur um des Vermeidens willen und ersetzt es durch eine effektive alternative und weniger explizite Syntax für denif....else-Konstrukt, und es hat keinen Sinn,if...elsezu verwenden, wenn man denelse-Teil nicht braucht.Darüber hinaus verwendet es einen Ausdruck als Anweisung, was man nicht tun sollte. Die Verwendung des ternären Operators erstellt einen Ausdruck, der zu einem Wert ausgewertet wird, nicht zu einer Anweisung, und man würde niemals einfach einen Wert schreiben, ohne ihn einer Variablen zuzuweisen oder ihn an einen Funktionsaufruf zu übergeben.
Also sollten Sie entweder tun
navigateTo(loggedIn ? 'profile' : 'login')oder das
const redirect = loggedIn ? 'profile' : 'login'Immer wenn ich sehe, wie jemand Ternaries schlecht macht und sich beschwert, wie sie angeblich so schwer zu lesen sind, sagt mir das, dass diese Person wahrscheinlich kein gutes Verständnis von JavaScript hat. Ähnlich wie die Verwendung von Klassen anstelle des Erlernen von Factory-Funktionen und Komposition. Ich benutze Ternaries ständig, wann immer ich kann. Hier ist mein Tipp für diejenigen unter Ihnen, die Schwierigkeiten haben, Ternaries zu lesen: SPRECHEN SIE SIE LAUT AUS. Beispiel: „Ist der Benutzer angemeldet? Wenn ja, bringen Sie ihn zum Dashboard, ANDERNFALLS bringen Sie ihn irgendwo anders hin“ ( logged_id ? dashboard() : logInPage() )
Das ist eine fantastische Lektüre. Vielen Dank, dass Sie das der Community zur Verfügung stellen. Meiner Erfahrung nach war die Verwendung von funktionalen Code-Best Practices durch die Erstellung kleinerer und prägnanterer Codes ein häufiges Thema für fehlerfreien Code. Fantastisch!
Dieser ternäre Ausdruck im Artikel
isLoggedIn ? navigateTo('profile') : navigateTo('unauthorized');ist sogar noch besser so
navigateTo(isLoggedIn ? ‘profile’ : ‘unauthorized’);Ich denke, es ist besser, weil es sehr klar macht, dass Sie zu
navigateTogehen und die einzige Frage ist wohin.Sie können `user = user || getFromLocalStorage(“user”)` mit den Standard-Funktionsparametern von ES6 tatsächlich vermeiden, was die Lesbarkeit weiter verbessert und die Code-Länge reduziert.
function login(user = getFromLocalStorage(“user”)) {
…
}
Hallo Burke, interessantes Thema!
Ich möchte nur darauf hinweisen, dass „guter Geschmack“ sehr geschmacksabhängig ist, und das gilt auch für Teile Ihres Artikels.
Wie Sie bereits sagten, denke ich auch, dass die Hauptsorge beim Schreiben eines Code-Stücks darin besteht, ihn lesbar zu machen. Und obwohl es keinen einzigen besten Weg gibt, dies zu tun, gibt es leider viele viele *„weniger gute“* Möglichkeiten, die Lesbarkeit zu verbessern … und einer davon ist meiner Meinung nach der ternäre Operator.
Ich persönlich benutze den ternären Operator ziemlich oft, aber wie andere bereits in den Kommentaren gesagt haben, ist er nicht dazu gedacht, als Ersatz für
ifverwendet zu werden. Ich benutze ihn für die Variablendeklaration, und das war's.Sie können Ihren Code so „clever“ schreiben, wie Sie möchten, und alle Ausdrücke in 2 Zeilen aufräumen, aber es wird Ihnen nicht helfen, wenn Sie ihn das nächste Mal lesen … es wird Ihnen tatsächlich Kopfschmerzen bereiten, da Sie Ihren Code beim Lesen neu überdenken müssen.
Alles, was ich sagen möchte, ist, dass Sie perfekt lesbaren Code mit
if-Anweisungen schreiben können, und wahrscheinlich viel sauberer als mit vielen Inline-Ausdrücken. Zum Beispiel würde ich Ihre erste Funktion, die mit 4 (auch verschachtelten)ifs überladen ist, so umschreiben.Und sobald Sie die Variablendeklaration von den eigentlichen Funktionsaufrufen getrennt haben, können Sie diese
ifleicht durch einen ternären Operator ersetzen, wenn das Ihr Ding ist.Sieht ziemlich ähnlich aus wie Ihre ternäre Umschreibung, oder?
Ich glaube nicht, dass es einen Krieg zwischen
if-Anweisungen undternary-Operatoren geben sollte … Sie können mit beiden schlechten Code schreiben. Sie müssen nur darauf achten, alle Werkzeuge, die Sie haben (wie Benennung und Leerzeichen), zu verwenden, um den Code zu vereinfachen und ihn lesbar und einfach zu warten zu machen (auch wenn das bedeutet, dass Ihre Funktion über mehrere Zeilen verteilt wird).Außerdem ist es erwähnenswert, dass aus Testperspektive
if-Anweisungen einfacher zu testen zu sein scheinen.Weiter so und insgesamt ein schöner Artikel! ✌️
Ich würde es keinen Trick nennen, eher eine Technik, nämlich kurzgeschlossene [boolesche] Auswertung. JavaScript-Programmierer können ihn glücklicherweise nutzen.
siehe https://en.wikipedia.org/wiki/Short-circuit_evaluation
Ich liebe ternäre Operatoren auch :)
Ich kannte die Tricks mit
&&und||nicht, also war ich dort sprachlos. Dann wieder sprachlos, als ich den Kommentar von Noki Doki übernavigateTo(isLoggedIn ? 'profile' : 'unauthorized')gelesen habe :)Da wir uns bemühen, die Komplexität zu reduzieren und die Lesbarkeit zu verbessern, fühle ich mich verpflichtet, pedantisch darauf hinzuweisen, dass in der folgenden Aussage die Klammern völlig unnötig sind, da die logischen Operatoren dieselben sind.
Natürlich wären sie erforderlich, wenn es so aussehen würde.
Und da ich schon dabei bin, pedantisch zu sein, sollte ich auch darauf hinweisen, dass ich einen Fehler gemacht habe, als ich das als Anweisung bezeichnete – es ist ein Ausdruck!