2013-09-05 11 views
18

Die letzten Tage habe ich einem Freund geholfen, Javascript zu lernen. Es ist seine erste Sprache seit Jahren und er erinnert sich so gut wie gar nichts, also hat er fast von Null angefangen. Er hat ein einfaches Tutorial durchgearbeitet und ich habe ihm einige Übungen zur Verfügung gestellt, um ihm beim Üben zu helfen. Die letzte Übung, die ich ihm gab, war die (scheinbar) klassische FizzBuzz problem. Er löste es mit ein bisschen Hilfe, aber er machte etwas sehr Interessantes, während er seine Lösung ausarbeitete. Er kam mit dem folgenden Code auf:Sind Kommas in Javascript if-Anweisungen syntaktisch gültig?

for (var x = 1; x <= 100; x++) { 
    if (x%3 == 0, x%5 != 0) { 
     console.log("Fizz"); 
    } 
    else if (x%3 != 0, x%5 == 0) { 
     console.log("Buzz"); 
    } 
    else if (x%3 == 0, x%5 == 0) { 
     console.log("FizzBuzz"); 
    } 
    else { 
     console.log(x); 
    } 
} 

Er war nicht vertraut mit boolean Vergleichsoperator, so hat er verwendet nicht && und stattdessen ein Komma verwendet. Meine Erwartung war, dass es abstürzen und etwas über einen Syntaxfehler sagen würde, aber zu meiner Überraschung lief es gut und druckte nur eine Reihe von "Fizz" und "Buzz" Zeilen aus, ohne "FizzBuzz" oder Zahlen. Unnötig zu sagen, dass ich verwirrt war, also habe ich ein bisschen experimentiert. Mein erster Test war dies auszuführen:

if (true, true) console.log('true, true'); 
if (true, false) console.log('true, false'); 
if (false, true) console.log('false, true'); 
if (false, false) console.log('false, false'); 

Welche gab mir zwei Zeilen der Ausgabe:

'true, true' 
'false, true' 

Von dass ich die Vermutung, daß alle Komma tat, war weil es nichts anderes als die letzte zu bewerten Ausdruck in der Liste. Ich habe dann versucht mit diesem Code:

for (var i = 0; i < 16; i++) { 
    if ((Math.floor(i/8) == 1), (Math.floor(i/4) == 1), (Math.floor(i/2) == 1), (i % 2 == 1)) { 
     console.log(i); 
    } 
} 

Der Ausgang bekam ich die ungeraden Zahlen 1 bis 15 alle war, die meine Vermutung von meinem ersten Test bestätigt (seit dem letzte boolean in der durch Kommata getrennte Liste jeden blättert andere Iteration).

Nach all dem langatmigen Kontext ist meine Frage: Ist diese Kommasyntax ein bekanntes und absichtliches Teil der Javascript-Engine, oder ist es eine seltsame, übersehene Eigenart des Interpreters? Ich weiß, dass Kommas für ein paar andere Dinge verwendet werden können (Initialisieren mehrerer Variablen in einer Zeile, Deklarieren von Arrays und Trennen von Parametern, die mir in den Sinn kommen), aber ich habe noch nie davon gehört, dass sie in irgendeiner Sprache in bedingten Anweisungen verwendet werden Ich bin neugierig, ob jemand anderes weiß, ob dieser Code überhaupt ausgeführt werden sollte oder nicht.

Als Referenz wurden der FizzBuzz-Code und der zweite Test, die ich ausgeführt habe, beide mit Knoten gemacht, und der erste Test, den ich ausgeführt habe, wurde in der Javascript-Konsole in Chrome gemacht, also scheint es nicht nur ein Browser zu sein. oder Knoten-exklusive Marotte, wenn es tatsächlich eins ist. Auch, wenn Sie tatsächlich so weit lesen, danke.

+0

Wenn alles andere fehlschlägt, gibt es immer die Spezifikation: [11.14 Komma Operator (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

Nun, dass Sie Haben Sie einige Erläuterungen zum Komma-Operator, beachten Sie, dass der angezeigte Code syntaktisch gültig ist, aber das FizzBuzz-Problem nicht löst. (Oder hast du gesagt, es war nur ein Schritt auf dem Weg zu einer gültigen Lösung?) – nnnnnn

Antwort

26

Das Komma ist ein tatsächlicher Operator. Er wertet beide Operanden (von links nach rechts) aus und gibt den Wert des zweiten Operanden zurück.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

Die häufigste Verwendung ist es, mehrere Parameter in einer for Schleife zu liefern, aber es kann auch für andere Zwecke verwendet werden.

+2

Huh. Anscheinend bin ich schlecht im Googeln. Ich habe versucht, es als Operator zu sehen, und bin ganz gescheitert. Danke für die schnelle Antwort. – Alex

Verwandte Themen