在 Javascript 中弹出数组 for 循环未获取所有数组项

Pop off array within Javascript for loop not getting all array items

我想弄清楚为什么下面的代码只弹出数组的最后 3 项而不是最后两项。

var test = ['test1','test2','test3','test4','test5'];

console.log('length - '+test.length);

for(var k = 0; k <= test.length; k++) {
    var tests = test.pop();
    console.log(tests+' - '+k);
}

以上代码的结果:

length - 5
(index):30 test5 - 0
(index):30 test4 - 1
(index):30 test3 - 2

Array.prototype.pop方法修改了原来的数组,所以for循环当然只会访问一半的值,直到数组完全清空。

你可以做的是改用 while 循环:

var test = ['test1', 'test2', 'test3', 'test4', 'test5'];

console.log('length - ' + test.length);

while (test.length) {
  var tests = test.pop();
  console.log(tests);
}

问题是数组的长度在循环执行时发生变化,因此测试
k <= test.length 会随着每次执行而变化。

var test = ['test1','test2','test3','test4','test5'];

console.log('length - '+test.length);

for ( var k = 0, len = test.length; k < len; k++ ) {
  var tests = test.pop();
  console.log(tests+' - '+k);
}

或使用 while 循环:

var test = ['test1','test2','test3','test4','test5'];

console.log('length - '+test.length);

var k = 0;
while (test.length) {
    var tests = test.pop();
    console.log(tests+' - '+(k++));
}

您每次都在增加 k。在打印 2k == 3 之后,列表中还剩下 2 个元素。但是由于k > test.length,循环结束。

如果你真的还想继续计数,请增加 k 但不要测试它:

var test = ['test1', 'test2', 'test3', 'test4', 'test5'];

console.log('length - ' + test.length);

for (var k = 0; test.length > 0; k++) {
  var tests = test.pop();
  console.log(tests + ' - ' + k);
}

考虑一下你正在做的事情的逻辑......你在两端燃烧蜡烛(可以这么说)。

k = 0,长度 = 5 ('test1') 此时 test5 被丢弃(这就是 pop 所做的,it drops the last element

k = 1,length = 4('test2')(此时test4丢掉)

依此类推...经过 3 次迭代后,您的数组有 3 个项目。

我*认为你想做的事你会用splice

完成
while(myArray.length > 0){
   console.log(myArray[0])
   myArray.splice(0,1)

}

如果您想保持自己的代码风格,只需添加以下行。这是为了防止在 for 循环中调整数组长度:

var arrSize = test.length;

您的最终代码如下所示:

<script>
    var test = ['test1', 'test2', 'test3', 'test4', 'test5'];

    var arrSize = test.length;

    console.log('length - ' + arrSize);

    for (var k = 0; k < arrSize; k++) {
        var tests = test.pop();
        console.log(tests + ' - ' + k);
    }
</script>