如果您注意到从索引 0 开始并向上计数的 for 循环的结果并没有从数组中取出数字 23。

使用 JavaScript 循环通过 evenArray 删除所有不偶数的值

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = evenArray.length - 1; i >= 0; i--) {
  if(evenArray[i] % 2 != 0){
    evenArray.splice(i, 1);
   }
 };
 console.log(evenArray);

//输出到这个将是 2, 6, 22, 98, 22, 12;
var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = 0; i < evenArray.length; i++) {
    if(evenArray[i] % 2 != 0){
        evenArray.splice(i, 1);
    }
};

console.log(evenArray);

//输出是 [2, 6, 22, 98, 23, 22, 12];

最佳答案

当您 splice 从数组中取出一个数字时,数组中该点之后的所有值都会向左移动。

在第二种方法中,索引 6 处的值为 45 。你发现它很奇怪,所以你拼接。现在 23、22 和 12 移动了,因此 23 现在位于索引 6。但是由于您正在向前迭代,因此您的 i++ 会将您移动到索引 7,从而有效地跳过 23,这就是结果中包含 23 的原因。

当你向后迭代时,你可以避免这个问题,因为所有被移位的数字都已经被处理了。

10-06 04:33