当运行条件设置为options.length时,为什么我的JavaScript for循环会提前停止?

时间:2016-12-21 18:20:03

标签: javascript loops

我构建了一个JavaScript for循环,其运行条件设置为选项Collection的长度。选项Collection的长度在循环之前通过console.log在27处验证。

但是当我运行循环时,它似乎只运行了14次 - 循环每次迭代都会删除一个选项,当它完成时,剩下13个选项。我也在循环之后运行console.log。

这是JSFiddle

这是我的for循环:

(function () {
    var industryOptions = document.getElementsByName("industry")[0].options;

    console.log(industryOptions.length);

    for (var k = 0; k < industryOptions.length; k++) {
        industryOptions.remove(0);
    }

    console.log(industryOptions.length);
})();

注意:当我将条件从industryOptions.length更改为27时,它会按预期工作。

为什么我的for循环在14个循环之后提前停止而不是整个industryOptions.length?谢谢!

5 个答案:

答案 0 :(得分:6)

industryOptions.remove(0);

即使您要添加数字,也会不断更改数组的长度。您需要使用不同的算法或技术。

一种方法是简单地重复直到数组为空:

while (industryOptions.length > 0)
    { industryOptions.remove(0); }

你可以从最后倒数而不是数数:

for (var k = industryOptions.length; k > 0 ; k -= 1)
    { industryOptions.remove(0); }

另一种技术是在循环开始之前确定长度,而不是在每次迭代时重新评估长度:

var loopStop = industryOptions.length;
for (var k = 0; k < loopStop; k += 1)
    { industryOptions.remove(0); }

或者你可以避免自己做这项工作并让阵列处理它:

industryOptions.splice(0, industryOptions.length);

另见this existing answer from 2009: How do I empty an array in JavaScript?

答案 1 :(得分:2)

当你在每个循环上splice()时,数组被重新索引并且其长度减少而数字循环是固定的(在循环语句中设置的原始数组长度)。循环逻辑被破坏了。

尝试反转数组循环顺序。替换:

for (var k = 0; k < industryOptions.length; k++) {

使用:

for(var k = industryOptions.length; k--;) {

答案 2 :(得分:1)

(function () {
        var industryOptions = document.getElementsByName("industry")[0].options;

        console.log(industryOptions.length);
        var length = industryOptions.length;
        for (var k = 0; k < length; k++) {
            industryOptions.remove(0);
        }

        console.log(industryOptions.length);
})();

在每次迭代中,您都会检查industryOptions的长度,以便您的for循环提前结束

答案 3 :(得分:0)

正如user3087839指出的那样,每次删除某个项目时,它会缩短industryOptions的长度,导致它在您预期之前结束。为避免这种情况,请使用预定义的长度进行检查,如下所示:

(function () {
        var industryOptions = document.getElementsByName("industry")[0].options;

        console.log(industryOptions.length);
        var industryOptionsLength = industryOptions.length;
        for (var k = 0; k < industryOptionsLength; k++) {
            industryOptions.remove(0);
        }

        console.log(industryOptions.length);
})();

答案 4 :(得分:0)

这是因为行industryOptions.remove(0);正在影响industryOptions对象本身。更具体:在每for次迭代中,您将industryOptions对象的长度减1;您将删除一个元素,然后验证循环条件(在下一次迭代开始之前)所以你要比较你刚修改的对象的长度。换句话说,当您使用industryOptions.length时,第一次迭代将检查k < 27,第二次迭代将检查k < 26,第三次迭代将检查k < 25等等。在某些时候k将等于industryOptions.length,循环将停止。那一点是k == industryOptions.length == 14