Бесконечный цикл создается при сдвиге и массиве - PullRequest
0 голосов
/ 18 января 2019

Почему следующий код приводит к бесконечному циклу?

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 голосов
/ 18 января 2019

arr.shift() возвращает undefined в пустом массиве, поэтому, как только вы сдвинете последний исходный номер, вы получите undefined, который затем вы возвращаете обратно в массив, так что массив никогда не достигает длина ноль.

0 голосов
/ 18 января 2019

Последнее, что вы делаете в цикле, это добавление элемента в массив, то есть длина массива всегда будет по крайней мере 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;
}
...