Бесконечный цикл при использовании array.length - PullRequest
1 голос
/ 18 июня 2019

Случайно столкнулся с этим. Когда я сохраняю array.length в переменной и применяю к условию цикла for с помощью оператора <=, цикл работает нормально, но когда я использую array.length с тем же оператором, он становится бесконечным. </p>

function map(array, callback) {
  let k =array.length;
   for(let i= 1; i<=k; i++)
     {
      array[i] = callback(array[i]);
     }

    return array;
}
console.log(map([1, 2, 3], addTwo));

Это работает как ожидалось. Но когда я использую это

   function map(array, callback) {

    for(let i= 1; i<=array.length; i++)
     {

     array[i] = callback(array[i]);
     }

    return array;
    }
     console.log(map([1, 2, 3], addTwo));

Конечно, i=0; i<array.length; это способ сделать это. Но мне любопытно, что происходит внутри.

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

В первом случае переменная с длиной не изменяется, но во втором вы берете длину непосредственно, и это изменение.

let k = array.length;

сохраняет длину, пока итератор не достигнет индекса, превышающего k.

Другой

for (let i = 1; i <= array.length; i++)
//                 ^

принимает фактическую длину и, в то время как индекс сравнивается с длиной, добавляет один индекс в массив для каждого вызова в конце исходного массива.

0 голосов
/ 19 июня 2019

Вы можете легко увидеть, что произойдет, если добавить туда console.log:

let addTwo = x => x + 2

function map(array, callback) {
  for (let i = 1; i <= array.length; i++) {
    console.log(i, array.length)  // <-- print out i and the length of the array
    array[i] = callback(array[i]);
    if(i==5)  // <-- so we do not run out of memory
     return false
  }
  return array;
}
console.log(map([1, 2, 3], addTwo));

Суть в том, что вы говорите, что for loop должен продолжаться, пока i меньше или равно array.length, но в то же время один разi достигает фактической длины массива, мы продолжаем увеличивать и .i через i++ и array.length через array[i] = callback(array[i]);, так что конца не видно.

...