2013-09-05 14 views
18

Negli ultimi giorni, ho aiutato un amico a imparare Javascript. È la sua prima lingua da anni e non ricorda praticamente nulla, quindi ha iniziato quasi completamente da zero. Sta seguendo un semplice tutorial e gli ho fornito alcuni esercizi per aiutarlo a esercitarsi. L'ultimo esercizio che gli ho dato è stato il (apparentemente) classico FizzBuzz problem. Lo ha risolto con un po 'di aiuto, ma ha fatto qualcosa di molto interessante mentre stava elaborando la sua soluzione. Lui si avvicinò con il seguente codice:Le virgole sono intese per essere sintatticamente valide in Javascript se le affermazioni?

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); 
    } 
} 

che non era familiarità con gli operatori di confronto booleani, quindi non ha usato && e invece utilizzate le virgole. La mia aspettativa era che si sarebbe schiantato e avrebbe detto qualcosa su un errore di sintassi, ma con mia sorpresa ha finito per funzionare bene e ho appena stampato una serie di linee "Fizz" e "Buzz", senza "FizzBuzz" o numeri. Inutile dire che ero confuso, quindi ho fatto un po 'di sperimentazione. Il mio primo test è stato quello di eseguire questo:

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'); 

che mi ha dato due righe di output:

'true, true' 
'false, true' 

Da questo, ho fatto l'ipotesi che tutto virgola fatto è stato causa di valutare nulla, ma l'ultimo espressione nella lista. Poi ho provato a fare funzionare questo codice:

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); 
    } 
} 

L'uscita ho ottenuto è stato tutti i numeri dispari da 1-15, che ha confermato la mia ipotesi dal mio primo test (dopo l'ultimo booleano nella lista separato da virgole stava sfogliando ogni altra iterazione).

Dopo tutto questo contesto prolisso, la mia domanda è questa: questa sintassi della virgola è una parte nota e intenzionale del motore Javascript, o è una strana stranezza trascurata dell'interprete? So che le virgole possono essere usate per poche altre cose (inizializzare più variabili in una riga, dichiarare array e separare i parametri mi vengono in mente), ma non ho mai sentito che vengano usati in affermazioni condizionali come questa in qualsiasi lingua, e Sono curioso di sapere se qualcun altro sa se questo codice debba essere eseguito o meno.

Per riferimento, il codice FizzBuzz e il secondo test che ho eseguito sono stati entrambi eseguiti utilizzando il nodo e il primo test che ho eseguito è stato eseguito nella console di Javascript in Chrome, quindi non sembra essere solo un browser- o una stranezza esclusiva del nodo se effettivamente lo è. Inoltre, se in realtà leggi fino a qui, grazie.

+0

Quando tutto il resto fallisce, c'è sempre la specifica: [11.14 Operatore di virgola (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

Ora che tu avere alcune spiegazioni dell'operatore virgola, notare che il codice mostrato è sintatticamente valido ma non risolve il problema di FizzBuzz. (O stavi dicendo che era solo un passo verso una soluzione valida?) – nnnnnn

risposta

26

La virgola è un operatore effettivo. Valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore del secondo operando.

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

suo uso più comune è quello di fornire più parametri in un ciclo for, ma può essere utilizzato anche per altri scopi.

+2

Huh. Apparentemente sono pessimo a cercare su google, allora. Ho provato a cercarlo come operatore e ho fallito completamente. Grazie per la risposta rapida. – Alex

Problemi correlati