Javascript:当循环结束时,while循环(全局)变量会被丢弃/重置吗

Javascript: Does the while loop (global) variable get discarded / reset when the loop finishes?

本文关键字:循环 变量 全局 结束 Javascript while      更新时间:2023-09-26

在下面的代码中,我得到了一个无限循环,因为当内部循环结束时,"I"似乎一直被重置为0。这导致外循环永远不会停止。

变量在循环后被重置是真的吗?我找不到这方面的文件。

  function chunk(arr, size) {  
    var twoDArr = [[],[]];
    var i = 0;
    var j = 0;
    var index = 0;  
    while(i < arr.length){
      while(j < size && i < arr.length){
        twoDArr[index].push(arr[i]);
        j ++;
        i ++;
      }
    index ++;
    }
  return twoDArr;
  }
  chunk(['a', 'b', 'c', 'd', 'f'], 2);
//-->  [ [ 'a', 'b' ], [ 'c', 'd' ],['f'] ]

它本身没有重置,但它只进入内循环一次(在递增i时(,因此外循环永远重复(i在内循环中变为2,此后再也不会递增(。

您可能希望在每个内部循环后重置j,例如:

while (i < arr.length) {
    while (j < size && i < arr.length) {
        // ...
    }
    j = 0;
    index++;
}

然而,您还应该检查index是否在twoDArr的范围内,因为一旦您到达index = 2,您将在以下行得到错误:

twoDArr[index].push();

您的问题是在第二次迭代中通过外循环跳过内循环,因此i不会更新,而i < arr.length始终为true。这是因为您从未重置j,所以j < size为false。为了真正实现您想要的,您需要重置j,并在内部循环中构建一个数组,以便将push放入最终的数组中。类似于:

function chunk(arr, size) {
  var twoDArr = [];
  var i = 0;
  while (i < arr.length) {
    var nestedArr = [];
    var j = 0;
    while (j < size && i < arr.length) {
      nestedArr.push(arr[i]);
      j++;
      i++;
    }
    twoDArr.push(nestedArr);
  }
  return twoDArr;
}
alert(JSON.stringify(chunk(['a', 'b', 'c', 'd', 'f'], 2)));

当然,使用reduce:可以使整个过程更加简洁

function chunk(arr, size) {
  return arr.reduce(function(p, c, idx) {
    if (idx % size) {
      p[p.length - 1].push(c);
    } else {
      p.push([c]);
    }
    return p;
  }, []);
}
alert(JSON.stringify(chunk(['a', 'b', 'c', 'd', 'f'], 2)));

while(j < size && i < arr.length){
        twoDArr[index].push(arr[i]);
        j ++;
        i ++;
}

2作为size传递给函数,因此当j < size && i < arr.length返回false时,内部循环将执行index++

在第二次执行时,j将是2,因此j < 2将是false

完成外部while循环的条件是i > arr.length,但i++被困在一个永远不会满足的条件中。