使用array.length时无限循环

时间:2019-06-18 20:36:33

标签: javascript arrays for-loop callback infinite-loop

随机遇到此问题。当我将array.length存储在变量中并使用运算符<=应用于for循环条件时,循环工作正常,但是当我将array.length与相同的运算符一起使用时,它就变成了无限。

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 个答案:

答案 0 :(得分:2)

在第一种情况下,具有长度的变量不会更改,但是在第二种情况下,您可以直接获取长度并进行更改。

let k = array.length;

保留一段长度,直到迭代器达到大于k的索引为止。

另一个

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

取实际长度,然后将索引与长度进行比较,从而为原始数组末尾的每次调用都向该数组添加一个索引。

答案 1 :(得分:0)

如果在其中添加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小于或等于iarray.length就应该继续前进,但同时i到达数组的实际长度,我们都会继续都增加i通过i++array.length通过array[i] = callback(array[i]);,因此看不到尽头。