从数组移入和推入数组时产生无限循环

时间:2019-01-18 14:44:31

标签: javascript arrays infinite-loop

为什么下面的代码会导致无限循环?

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
while (arr.length > 0) {
  console.log(arr.shift());
  arr.push(arr.shift());
}

2 个答案:

答案 0 :(得分:4)

循环中的最后一件事是向数组添加一个项,这意味着数组长度将始终至少为1。即,arr.length > 0的求值总是为true

编辑:添加示例以显示正在发生的事情。最终,当数组中没有剩余内容时,arr.shift()的计算结果为undefined,然后将undefined推回到数组中,从而使数组的长度为1个元素变长。请参阅下面的控制台输出。

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

let i = 0;

while (arr.length > 0 && i < 50) {
  arr.shift();
  arr.push(arr.shift());
  console.log(arr);
  i = i + 1;
}

答案 1 :(得分:3)

arr.shift()在一个空数组上返回undefined,因此,当移出最后一个原始数字后,您将得到undefined,然后将其推回到数组中,因此数组永远不会达到零的长度。