2016-02-24 19 views
-2

我已經採用了一個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

該循環在其主體中沒有任何語句,但它仍然需要是一個循環,因爲它仍然運行一些迭代。在循環內放入一些console.log()語句來記錄所有的變量,你會看到發生了什麼。 – nnnnnn

回答

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; 
} 
+0

爲什麼這裏用於循環?循環用於實現從一個點到另一個點的代碼。這裏for循環在每個函數調用中實現一次 –

+0

不,它根據條件和最終表達式運行多次。您可以嘗試運行它並親自查看它,直到「條件」部分未滿足爲止。 – Idos

+0

我做了console.log,我看到了三次循環,並且在每次循環中遞減。如果我們沒有任何地方宣佈這種情況讓我減少,爲什麼我減少,其次是我們爲什麼需要循環採取三個結果之一?簡單地math.random做到了嗎?不是嗎? –