JS for循环中的数组



这段代码将在每次迭代arr中在控制台上打印[1,2,3,4,5,6,7,8,9,10]。长度变化,这也反映在循环体中。

let arr = [1, 2, 3];
for (e of arr) {
  arr.push(arr[arr.length - 1] + 1);
  if (arr.length >= 10) break;
}
console.log(arr)

但是在这里,输出将是[4,5,6],这意味着shift()函数没有考虑数组的扩展。

let arr = [1, 2, 3];
for (e of arr) {
  arr.push(arr[arr.length - 1] + 1);
  if (arr[arr.length - 1] >= 10) break;
  arr.shift();
}
console.log(arr)

我的问题是为什么?我期望第二个代码 的[8,9,10]输出

原因是您首先添加元素,然后调用shift()来删除元素,因此数组大小不会改变,它只会迭代一次

let arr = [1, 2, 3];
for (e of arr) {
  arr.push(arr[arr.length - 1] + 1); // add element
  if (arr[arr.length - 1] >= 10) break;
  arr.shift(); // remove element
}
console.log(arr)

为了得到预期的结果,我们需要确保它可以迭代不止一次,直到得到预期的结果。我们可以把for改成while

let arr = [1, 2, 3];
while(arr.at(-1) < 10) {
  arr.push(arr.at(-1) + 1);
  arr.shift();
}
console.log(arr)

第二个for ...of循环工作正常:

  let arr = [1, 2, 3];
  for (e of arr) {
    arr.push(arr[arr.length - 1] + 1); // 4, 5, 6
    if (arr[arr.length - 1] >= 10) break; // false, false, false
    arr.shift(); // 1, 2, 3
  }
  console.log(arr); // [ 4, 5, 6 ]

因为你用shift()在每个循环中删除数组的第一个元素,你的数组在循环开始时永远不会超过3个元素,所以它只循环3次。

希望对你有帮助。

最新更新