从代码中删除警报会强制其进入无限循环

我有一段代码,其中包含一些窗口警报消息。工作正常。但是,如果删除警报语句,程序将进入无限循环。对我来说这很奇怪。

有人可以帮助我确定代码问题吗?

function countSwaps(arr) {

    let notVisited = {},swaps = 0;
    for (let i = 0; i < arr.length; i++) {
        notVisited[i] = true;
    }

    while (Object.keys(notVisited).length) {
        alert("main pass");
        let nextPos,currentPos = Object.keys(notVisited)[0];
        while (arr[currentPos] !== parseInt(currentPos+1)) {
            nextPos = arr[currentPos] - 1;
            [arr[currentPos],arr[nextPos]] = [arr[nextPos],arr[currentPos]];

            swaps+= 1;
            alert("Swap " + arr[currentPos] + " and " + arr[nextPos] + "\n");
            delete notVisited[nextPos];
        }
        delete notVisited[currentPos];
    }
    return swaps;
}
console.log(countSwaps([2,3,4,1,5]));
chongqingwangjing 回答:从代码中删除警报会强制其进入无限循环

好吧,它也为我运行了一个无限循环,也没有警报。

问题似乎在于以下表达式:parseInt(currentPos+1)

加法发生在从字符串到数字的转换之前,例如:

currentPos = '4';
currentPos + 1 == '41';
parseInt(currentPos + 1) == 41

您想要的可能是parseInt(currentPos) + 1。现在:

currentPos = '4';
parseInt(currentPos) + 1 == 5

有了这个循环似乎退出了,我得到了3个交换的结果。

,

这是无限循环的原因。

while (Object.keys(notVisited).length) 

应该是

while (Object.keys(notVisited).length > 0)

这是一个属性,它将始终返回true

本文链接:https://www.f2er.com/3145156.html

大家都在问