2016-06-08 8 views
-2

Wenn Sie eine Funktion haben, die 4 Bedingungen überprüft (wir A sagen, B, C und D), und dass, wenn einer von ihnen true ist die Funktion sollte zurückgeben false.
Einzeiler Rückkehr für „wenn irgendetwas davon wahr ist return false“

Es funktioniert, wenn Sie es so schreiben:

function is() { 
    return (
      !A && !B && !C && !D 
) 
} 

jedoch in diesem Fall (korrigiert mich wenn ich falsch liege) - alle Bedingungen wird jedes Mal (während geprüft werden, und return (A || B || C ||D) kann genug sein, dass A zum Beispiel true und Rück false

Sie können die Funktionalität der Funktion einfach umkehren zu stoppen ist, verwenden, aber was ist, wenn Sie es wollen, so bleiben.

dh was ich suche ist ein Einzeiler return, die äquivalent ist:

if (a) return false; 
if (b) return false; 
if (c) return false; 
if (d) return false; 
return true; 

EDIT: in den Antworten und Kommentare Wie erwähnt, ist es falsch anzunehmen, dass in Im ersten Beispiel werden alle Bedingungen jedes Mal überprüft. Sobald einer von ihnen zu false auswertet (was bedeutet, dass wenigstens einer von A, , C, wahr ist, d.h. "nicht nicht wahr"), wird er angehalten und false zurückgegeben.

+0

'Rückkehr! (A || B || C || D)' wäre die am meisten zu kurze Kurzschlussversion. Nicht sicher, warum du das nicht willst. Du kannst deinen Kuchen nicht essen und auch nicht essen, d. H. Du kannst nicht zulassen, dass er "so bleibt" und auch etwas kurzschließen und auch ein One-Liner. – deceze

+1

Ihr erster Code-Block funktioniert genau so, wie Sie sagen. – Pointy

+0

@deceze warum nicht? Ist nicht ein &&! B auch ein Kurzliner? –

Antwort

4

Sie sind falsch dazu:

jedoch in diesem Fall (korrigiert mich wenn ich falsch liege) - alle die Bedingungen jedes Mal geprüft werden (während es kann sein, dass für Beispiel ist A true false

im Falle eines && der Ausdruck als false ausgewertet wird, sobald zu stoppen und zurück, wie ein Begriff falsch ist

Hier

ist ein excerpt of MDN:

Kurzschlussauswertung

Als logische Ausdrücke nach rechts ausgewertet links, werden sie für möglich „Kurzschluss“ Auswertung unter Verwendung der folgenden Regeln geprüft:

  • false& & alles ist Kurzschluss ausgewertet zu false.
  • true|| alles ist Kurzschluss ausgewertet zu true.

EDIT

Wie in anderen Antworten erwähnt und Kommentare, die Sie natürlich Ihren Ausdruck auf diese Weise umschreiben kann:

return !(A || B || C || D) 

Es gibt immer noch ein Kurzschluss Evaluierung sollte so sollte es keine signifikante Leistungsverbesserung, aber der Ausdruck könnte für manche klarer aussehen. IMO ist es eher eine Frage des Geschmacks.

1

Sie irren sich, wie es funktioniert. Boolesche Operatoren wie & & und || Kurzschluss; Sobald die ganze Expression einen bekannten Wert hat, hören sie auf zu testen. Wenn A also Atrue ist, dann ist !Afalse, und es ist unmöglich für false && <anything>true zu sein, also hört es sofort auf zu testen.

Jede Programmiersprache, die ich kenne, verwendet in solchen Fällen einen Kurzschluss, und es ist nicht nur ein Effizienz-Hack, es ist ein garantierter Teil des Sprachstandards, so dass Ausdrücke auf der rechten Seite eines Tests wissen, dass der frühere Test bestanden hat . Ansonsten wäre in einer Sprache wie C ein Test wie if (p && p->someattr) nicht sicher, weil ohne Kurzschluss pNULL sein könnte, aber es wäre immer noch dereferenziert, um p->someattr zu testen.

Für den Rekord, sollten Sie einige große Anzahl von Werten testen müssen, um zu sehen, ob irgendwelche truthy sind, und Sie sie als Array gespeichert haben, können Sie .some() verwenden, um sie zu überprüfen. Zum Beispiel:

var resultarray = ...; 
if (resultarray.some(Boolean)) { 

} 

Oder Ihren Fall zu simulieren, wo Sie für alle von ihnen zu testen sein falsy:

var resultarray = ...; 
if (!resultarray.some(Boolean)) { 

} 

Beide dieses Kurzschlusses, sobald der eine einzige truthy finden Wert. In ähnlicher Weise kann Array.every verwendet werden, um zu testen, ob alle Einträge eine Bedingung erfüllen, und nicht mindestens eine, und sie schließt kurz, wenn mindestens ein falscher Wert gefunden wird.

Verwandte Themen