我已经使用了一个JavaScript函数,它在for
循环的帮助下对数组元素进行混洗,该循环接受参数但没有正文(空体)。
在for
循环评估之后,数组元素被洗牌。这是codepen。
这是函数的代码:
function shuffle( array ) { // Shuffle an array
//
// + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
for(var j, x, i = array.length;
i;
j = parseInt(Math.random() * i),
x = array[--i], array[i] = array[j], array[j] = x){
}
return array;
}
console.log(shuffle(['Kevin', 'van', 'Zonneveld']));
如果循环没有正文,我可以初始化for
循环之外的所有元素吗?如下所示:
var j, x, i = array.length;
var j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j];
array[j] = x;
答案 0 :(得分:2)
您可以在for
循环之前初始化变量,但不能按照您指定的方式初始化变量
for
循环的syntax为:
for ([initialization]; [condition]; [final-expression])
statement // for you this is empty - no statement
在第一个分号(;
)之前,您可以看到第一个初始化步骤。所以正确的初始化将是:
var j, x, i = array.length;
但不是:
var j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j];
array[j] = x;
因为这些是条件和最终表达步骤。请注意,当满足条件!i
时,您的循环将结束
没有理由去执行这个艰难的任务。如果这样做,请确保只省略for
循环的初始化部分而不是其他任何循环部分。
查看此循环的更简单方法是:
for (
// initialisation: declare three variables
var j, x, i = array.length;
// The loop check: when it gets to `!i`, it will exit the loop
i;
// the increment clause, made of several "sub-statements"
j = parseInt(Math.random() * i),
x = array[--i],
array[i] = array[j],
array[j] = x
)
{ } // The body of the loop is an empty statement
为了完整起见,您可能会发现查看此while
循环的等效for
循环更容易理解(请注意初始化在循环之前的位置):
var j, x, i = array.length;
while (i) {
j = parseInt(Math.random() * i);
x = array[--i];
array[i] = array[j];
array[j] = x;
}