是什么导致了这种奇怪的shuffle算法行为?

时间:2017-02-03 12:39:02

标签: javascript arrays sorting

因此,这种排序算法是我从这里开始的,我只是想绕过它的工作方式。当我将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次吗?

1 个答案:

答案 0 :(得分: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解释器试图以数组的形式访问警报的返回值(显然不是这样)。该错误会阻止您的循环继续,因此您只能获得第一个警报。

我建议您阅读Ben Alman's blog post(讽刺咆哮)以获取更多关于JavaScript中分号的内容。