2017-02-03 95 views
0

因此,這種排序算法是我從這裏拉下來的,我只是試圖圍繞它的工作原理。當我把alert(i)置於這個位置時,它會按預期五次提醒。什麼導致這個奇怪的洗牌算法行爲?

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     alert(i) 
     let j = Math.floor(Math.random() * i); 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

但是,如果我把它放在這個位置,它只會提醒一次。

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     let j = Math.floor(Math.random() * i); 
     alert(i) 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

這是什麼原因造成的?循環還沒有運行5次?

+0

我以爲它注入分號。這是什麼使它只喚醒一次警報? –

+0

自動分號斷言有些破碎的功能,只是總是使用分號。打F12看看,什麼是打破代碼... – Teemu

+0

我嘗試了你的代碼(用分號)。我得到相同數量的警報。 [IE - >點擊F12] | [Chrome - > Ctrl + Shift + I] | [火狐 - >按Ctrl + Shift + Q] – Marcus

回答

2

簡單的答案是,你alert後省略分號引起的問題:

function shuffle(a) { 
 
    for (let i = a.length; i; i--) { 
 
     let j = Math.floor(Math.random() * i); 
 
     alert(i) 
 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
 
    } 
 
}

線4 + 5被解析爲:

 alert(i)[a[i - 1], a[j]] = [a[j], a[i - 1]];

這意味着JS解釋器試圖以數組的形式訪問警報的返回值(顯然不是這樣)。該錯誤阻止了你的循環繼續,所以你只能得到第一個警報。

我建議在JavaScript中分號閱讀Ben Alman's blog post(諷刺的咆哮)的多一點。

相關問題