2016-09-04 2 views
0

Während mein Code komprimiert, fand ich Compiler, wenn & Elses auf rohe Logik Umwandlung wie:Javascript Logik Notationen

if (a) b(); zu a && b();

Nach einigem Verständnis es Sinn gemacht, aber nie, dass ich wusste, dass du && s nutzen könnten und || s außerhalb von if() s.

Was ich wissen wollte war, sind sie genau das gleiche - ist if einfach ein Alias ​​für die & & Struktur, und das gleiche für || zu sonst? Kompiliert ein Browser if (a) b(); zu a && b(); ohne mich überhaupt zu wissen?

Auch, wie schlecht einer Praxis ist es, die Notation a && b(); zu verwenden.

ich es bin zu raten, würde für seinen Mangel an Lesbarkeit verurteilt werden, aber es ist wirklich kurz ...

+0

sie sind gleich, da in der Notation: a && b(), b() nur dann ausgeführt werden, wenn ein truthy ist. Was ist das gleiche wie zu sagen, wenn a wahr ist, dann tu b(). Ich weiß nicht, wie der Compiler diese – Cruiser

+0

&& und || behandelt sind Betreiber. Wie alle Operatoren erzeugen beide ein Ergebnis, das getestet werden kann (eine Bedingung). Alles was "if" ist, testet eine Bedingung und wenn sie wahr ist, wird sie eine Anweisung ausführen. Im trivialen Fall (wo es nur eine Bedingung und keine else-Anweisung gibt), "wenn (a) b()" und "a && b()" äquivalent sind. – Tibrogargan

Antwort

2

Nr if (condition) stmt1 else stmt2 näher an condition ? stmt1 : stmt2 ist. Sie können den Unterschied sehen, wenn Sie die completion value betrachten.

var b = true; 
var n = 1; 

&& und if gleich aussehen, wenn die Bedingung erfüllt ist:

alert(eval('if (b) { n }')); // 1 
alert(eval('b && n')); // 1 

aber sie unterscheiden sich, wenn die Bedingung falsch ist.

alert(eval('if (!b) { n }')); // undefined 
alert(eval('!b && n')); // false 

a && b ausgewertet a wenn es truthy oder b sonst aber if (a) b else c ist viel näher an a ? b : c in seiner Vollendung Verhalten, weil if (a) b Abkürzung für if (a) b else {} ist.

var a = true; 
var b = 1; 
var c = 2; 

alert(eval('a ? b : c')); // 1 
alert(eval('!a ? b : c')); // 2 

alert(eval('if (a) b; else c')); // 1 
alert(eval('if (!a) b; else c')); // 2 

Auch, wie schlecht der Praxis ist es die eine & & b() zu verwenden; Notation.

Lassen Sie Ihren JS-Minifier kürzer machen.

Is there a good JavaScript minifier?

1

Jeder Ausdruck in Javascript ist auch eine Aussage.

Ausdrücke sind Dinge wie: obwohl

1 + 3 
a - b 
4 + f(5) 

Jeder dieser Ausdrücke zu einem Ergebnis zu bewerten, müssen Sie es nicht erfassen. Genauso wie Sie den Rückgabewert einer Funktion wegwerfen können, indem Sie sie einfach nicht mit einem '=' versehen, können Sie den Rückgabewert jedes Ausdrucks wegwerfen.Folgendes gilt:

function a() { 
    8 + 5; 
    "hello"; 
    a == 3; 
} 

Zugegeben diese Funktion ist nicht sehr nützlich, aber es zeigt, wie Ausdrücke Ausgänge weggeworfen werden kann.

Jetzt, auf das Beispiel, das Sie zur Verfügung gestellt ... Der & & Operator ist eine logische UND. Es nimmt zwei Parameter (jede Seite davon) und bewertet entweder wahr oder falsch. Normalerweise würden Sie es so verwenden:

var result = f(4) && f(5); 

Dieser Operator hat auch einen anderen Aspekt zu seinem Verhalten, obwohl; es gibt eine "Kurzschlussauswertung". Was bedeutet das? Überlegen Sie, was ein UND tatsächlich tut; es gibt nur wahr zurück, wenn beide Parameter wahr sind.

Wenn der erste Parameter falsch ist, hat es keinen Sinn, den zweiten zu überprüfen, weil Sie bereits wissen, dass sie nicht beide wahr sind, und Sie wissen, dass Ihr Ergebnis falsch ist. "Kurzschlussauswertung" ist, wenn die Laufzeit das zweite Argument nicht bewertet, wenn das erste Argument bereits alles liefert.

Im Fall von & &, wenn der erste Parameter falsch ist, wird es nicht die Bewertung des zweiten Parameters stören. Wenn der zweite Parameter der Rückgabewert einer Funktion ist, wie z. B. a && b(3), wird b (3) NICHT aufgerufen. Wenn a wahr ist, muss andererseits b (3) aufgerufen werden, um herauszufinden, ob a && b(3) wahr ist.

Dank der Kurzschlussauswertung verhält sich das logische UND also tatsächlich wie ein Wenn-Dann, nur die Auswertung des zweiten Parameters, wenn der erste wahr ist.

Das Gegenteil gilt für die || (ODER) -Operator, wobei der zweite Parameter nur ausgewertet wird, wenn der erste falsch ist (weil wahr ODER alles immer wahr ist).

Zurück zum Anfang dieser Antwort, wo wir über Ausdrücke gesprochen haben, sehen wir, dass der Ausdruck a && b() nur Standalone verwendet werden kann. Wir müssen das Ergebnis nicht erfassen, wir wollen nur die Kurzschlussauswertung verwenden, um zu steuern, ob b() aufgerufen wird oder nicht. Das letztendliche Ergebnis, richtig oder falsch, wird weggeworfen.

More information on short-circuit evaluation

+0

Also: 'var a = b && c 'weist a einen booleschen Wert zu; jedoch 'var a = b || c 'weist a den ersten truthy Wert zu, undefined. Der Mangel an Symmetrie lässt mich glauben, dass etwas falsch ist. –

Verwandte Themen