Es sei denn, vs, wenn in Javascript mit Verwendung von Ausrufezeichen?
Den code unten versuche zu drucken "ist auch" für zahlen, die durch 2 teilbar.
Sollte es nicht so sein, wenn (test) dann() anstatt: if (!test) dann(), wenn die Bedingung getestet ist "n % 2". Der folgende code scheint zu Lesen", WENN zahlen sind NICHT durch 2 teilbar, drucken Sie "- Nummer ist auch' ", die nicht logisch erscheinen.
Mehr generell, was sind die Vorteile des Schreibens eine Wenn-Funktion mit einer If-Anweisung bei der Angabe der Bedingung, wenn das, was wir tun können, einfach zu schreiben, wenn (!Zustand)?
Jede Hilfe wird sehr geschätzt.
function unless(test, then) {
if (!test) then();
}
function repeat(times, body) {
for (var i = 0; i < times; i++) body(i);
}
repeat(5, function(n) {
unless(n % 2, function() {
console.log(n, "is even");
});
//→ 0 is even
//→ 2 is even
//→ 4 is even
%
nicht testen Teilbarkeit. Es ist ein modulo - operator. Dieser code testet, obn % 2
ausgewertet, was man als false (aka0
) und, wenn ja, ist es auch.- "Der folgende code versucht, drucken Sie "sogar" für zahlen, die durch 2 teilbar." - Versucht es nicht, es tut es. (Zumindest, sobald Sie fix die syntax-error am Ende wird Sie es tun.) Eh, ich bin damit einverstanden, dass die Idee "es sei denn" nicht wirklich sinnvoll semantisch für diesen test, aber der code nicht das gewünschte Ergebnis. Diese Art von Funktionen, die Aussehen wie Sie gehören in ein Test-framework, sodass Sie eine Behauptung, und etwas tun, wenn die Behauptung als falsch erweist.
- Dieser code ist entsetzlich, wie durch die Tatsache belegt, dass es nicht einmal klar ist, was es tut, ohne sorgfältige Analyse. Es gibt keinen Vorteil hier. Ich kann nicht behaupten Vorteile im Allgemeinen Fall. Vielleicht ist es von Vorteil, es zu tun auf diese Weise, wenn Ihre pointy-haired boss das sagt es so machen oder du wirst gefeuert werden. Sie benötigen einen Kontext, wenn Sie vielleicht für diese Frage sinnvoll zu sein.
- Der code ist Teil der Eloquent JavaScript. Es scheint aus dem Zusammenhang hier, es ist nur ein Beispiel bei der Erläuterung höher, um Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den strittigen Vorteil hierbei ist, dass der code liest sich etwas mehr wie Englisch: "es sei denn, n modulo 2 ungleich null ist, log auf der Konsole, dass n gerade ist."
In meiner Erfahrung, die praktische Konsequenz ist, dass die meisten Programmierer gehen müssen, überprüfen, was, es sei denn, () eigentlich tut, bevor Sie sich wohl fühlen mit ihm. Denn es ist nicht ein standard-Stück von Javascript, die Sie haben keine Möglichkeit zu wissen, ob es verwendet ! oder ==true oder ===0 oder einige andere immer-so-etwas anders testen, es sei denn, Sie gehen, sehen Sie bei der Umsetzung.
Mein Lieblings-Beispiel für dieses Prinzip ist COBOL. Diese Sprache sehr hart versucht, zu ähneln Englisch, so dass auch nicht-Programmierer benutzen könnte...aber in der Realität Programmierer und nicht-Programmierer scheinen zu hassen, zu arbeiten.
go_outside() and play() unless $is_raining;
. In diesem spezifischen Beispiel gibt es keine Strafe, es zu benutzen, aber wie alles in Perl, es kann leicht missbraucht werden, in einer Weise, die macht-code weniger lesbar.Gibt es keine Vorteile, wenn die Bedingung vorausgesetzt, inline, wie in diesem Szenario. Sie können leicht anwenden einer transformation zu negieren, es als angemessen, in allen Fällen (z.B. hinzufügen eines
!
vor), und unterunless
aus dem Bild bedeutet, dass es eine Sache weniger, die Leser zu wissen.Dort könnte ein Vorteil sein, wenn die Bedingung in form einer callback, z.B.:
In dieser situation könnten Sie nicht direkt übergeben, die negation der
test
auf eine hypothetische FunktiononlyIf
Ergänzungunless
, so dass beideonlyIf
undunless
können machen den code lesbarer, weil es Ihnen erlaubt, dies zu tun:stattdessen:
Sich die obige situation könnte noch schlimmer werden, wenn der Rückruf ist gegeben, Argumente werden müssen vermehrt in
test
.