In primo luogo, vorrei sottolineare che tale loop è considerato di cattivo gusto, poiché è molto illeggibile e causa molta confusione. Questo è un tipico esempio di ottimizzazione andato male.
Guardando il specs, vi accorgerete che for(...)
deve essere seguita da una dichiarazione . Può essere any statement, compresi i blocchi. Quindi, tutti questi sono validi:
for (...)
foo; // expression statement
,
for(...)
{
// block statement
}
,
for(...)
if(...) // If statement
foo;
, e, naturalmente,
for (...)
;
dal ";
" è il empty statement. Non fa nulla, ma è sufficiente a rendere for(...);
sintatticamente valido.
Ora, per le virgole. Si noti che il contenuto del paren deve essere tre expressions, (ciascuno facoltativo), separati da punto e virgola. Praticamente "tutto" si qualifica come espressione, incluso comma-separated lists of expressions. Sebbene poco conosciuti, questi funzionano praticamente ovunque in JS, non solo nei loop for
. Vengono semplicemente valutati uno dopo l'altro.
Così, il ciclo può essere riscritta in questo modo
shuffle = function(o) {
var j, x, i = o.length;
while (i) { // for-loops are just while-loops in disguise
j = parseInt(Math.random() * i), // even better: replace , by ;
x = o[--i],
o[i] = o[j],
o[j] = x;
}
return o;
};
Inoltre, x = o[--i]
dovrebbe essere scritto come i--; x = o[i]
.
Se c'è solo un ciclo for, lo script funzionerà, ma se ne hai più di uno dopo l'altro, devi separare le istruzioni. – Rayshawn