复杂的循环与空体

时间:2016-02-24 08:12:11

标签: javascript arrays loops for-loop initialization

我已经使用了一个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;

1 个答案:

答案 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;
}