2016-04-12 7 views
0

Ich versuche, diesen Code aus Eloquent JavaScript zu verstehen:(! N% 2) ist das gleiche wie (! N% 2 == 0)?

function unless(test, then) { 
    if (!test) then(); 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    unless(n % 2, function() { 
    console.log(n, "is even"); 
    }); 
}); 
// → 0 is even 
// → 2 is even 

ich, dass es erhalten sagt, führen Sie den folgenden Code 3 mal Tests mit 0,1,2:

if (!n%2) function(n) { 
    console.log(n, "is even"); 
}); 

Was ich don‘ t bekommen ist, wie wir wahr/falsch von (!n%2) bekommen?

Ist (!n%2) das gleiche wie (!n%2 == 0)?

+0

so weit ich weiß Javascript wertet einen Ausdruck als wahr aus, solange er nicht zu 'null' noch 'undefiniert' auswertet. Mit anderen Worten, in Javascript wird alles mit einem * valide/known * Wert als wahr ausgewertet. – Veverke

+0

@ Veverke - ... oder eine leere Zeichenfolge oder "0". –

+0

Sei so explizit wie möglich mit deinen Bedingungen. Diese "Tricks" sind sprachabhängig, und niemand hat genug Zeit sich zu merken, wie jede andere Sprache mit ihnen umgeht. so auch wenn (! N% 2) tut was du willst. Benutze es nicht. – dustinroepsch

Antwort

0

Ihr Testcode, den Sie schrieb an den Beispielcode aus dem Artikel nicht entspricht.

Im Beispielcode wird zuerst n % 2 ausgewertet und das Ergebnis wird an die unless-Funktion übergeben. Dort führen Sie eine logische Nicht-Operation gegen das Ergebnis durch.

Wenn n gerade ist, wird n % 20 an unless übergeben. Ein boolescher Vergleich von 0 gibt false zurück und das ! negiert das Ergebnis (logisch nicht), also !0 == true. Dies wiederum verursacht, dass die then-Funktion ausgelöst wird.

Wenn n ungerade ist, tritt das Gegenteil auf. Es wird ein anderer Wert als 0 übergeben, der false lautet, was dazu führt, dass then nicht ausgelöst wird.

Im Gegensatz dazu funktioniert der Versuch, den Beispielcode ohne Verwendung von Higher-Order-Funktionen zu reproduzieren, nicht auf die gleiche Weise. !n % 2 führt zuerst die logische Not auf n, dann versuchen Sie, das Ergebnis zu modulo. !(n % 2) ist eine bessere Darstellung des Beispielcodes.

+0

Ich sehe, was du meinst, ich konnte den Fluss im Code überhaupt nicht verstehen. Ich sollte zuerst in Gedanken daran denken, was das Ergebnis von 'n% 2 'ist, und dann das'! 'Auf dieses Ergebnis anwenden. Dies machte es viel einfacher zu verstehen. –

1

Logical NOT ! hat higher precedence als modulo operator %.

Somit entspricht (!n%2)(!n) % 2, die immer 0 einen falschen Wert zurückgibt, außer wenn n = 0.

Wobei (!n%2 == 0)true (wieder außer 0) zurückgibt.

Sie beide sind nicht gleich, in der Tat sind sie einander entgegengesetzt (Falsch vs truthy Wert).

Sie benötigen !(n % 2).

Oder einfach zu überprüfen, ob Zahl ist sogar

n % 2 === 0 
+1

Es gibt nicht immer '0' zurück. Versuchen Sie mit 'n = 0' – Bergi

+0

@Bergi Danke, aktualisiert. :) – Tushar

0

!Boolean(n%2) sollte als eine Möglichkeit arbeiten, um zu bestimmen, ob eine gerade oder ungerade ist.

Denken Sie daran, dass Boolean BIDMAS nicht folgt.

Es tut !n zuerst, wo n als Boolean behandelt wird, so dass der numerische Wert von 0 als false behandelt wird, und anderer numerischer Wert wird als true behandelt. Das Ausrufezeichen invertiert den logischen Zustand n. Jetzt

die %2 wandelt die Boolesche zurück zu einer Ganzzahl, wobei true ist 1 und 0false ist. !n = 0 gibt 0 zurück und !n = 1 gibt 1 zurück.

Die Verwendung von !n%2 in einer if-Anweisung konvertiert es zurück in einen booleschen Wert (1 = true, 0 = false).

Also wenn n = 0 dann die if-Anweisungen weiter, weil es wahr zurückgegeben. Wenn n != 0 (!= Bedeutung nicht gleich) dann if-Anweisung übersprungen wird, weil es falsch zurückgibt.

0

Nein, ist es nicht. Wie gesagt here das "!" Der Operator hat den höchsten Vorrang vor "%", so dass der Ausdruck wahr zurückgibt, wenn n 0 ist, und falsch, wenn n von 0 verschieden ist. Im Einzelnen sei angenommen, dass n 2 ist.die Ausführung des Ausdrucks:

(!n)%2 
(!2)%2 
0%2 
0 

so ist es falsch, jetzt n = 0

(!0)%2 
1%2 
1 

so ist es wahr. Es ist das entgegengesetzte Verhalten von (! N% 2 == 0), das wahr zurückgibt, wenn n sich von 0 unterscheidet und andernfalls falsch, da == weniger Vorrang hat und der Vergleich mit 0 am Ende der obigen Berechnung ausgeführt wird. Sie können sich leicht überzeugen, indem Sie diese einfache Javascript mit unterschiedlichen Werten von n mit:

n = 1; 
    if(!n%2) 
    { 
     document.getElementById("par1").innerHTML="true"; 
    } 
    if(!n%2 == 0) 
    { 
     document.getElementById("par2").innerHTML="true"; 
    } 
Verwandte Themen