这段代码将在每次迭代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次。
希望对你有帮助。