为什么这个javascript代码有无限循环?

时间:2010-05-13 20:22:46

标签: javascript

optionElements是一个二维数组。每个元素都有一个长度为2的数组。这些是一个整数和一个元素。我有一个名为linkbox的选择列表,我想将所有元素添加到选择列表中。我希望他们进入的顺序很重要,并且由每个元素的数量决定。它应该是最小的到最高的。所以想想这样:

optionElements是:

[ [5, <option>], [3, <option], [4, <option], [1, <option], [2, <option]]

它会按照这些数字的顺序将它们添加到链接框中。但这不是发生的事情。这是第一次之后的无限循环。我添加了x约束只是为了阻止它冻结我的浏览器,但你可以忽略它。

var b;
var smallest;
var samllestIndex;
var x = 0;
while(optionElements.length > 0 && ++x < 100)
{
    smallestIndex = 0;
    smallest = optionElements[0][0];
    b = 0;
    while( ++b < optionElements.length)
    {
        if(optionElements[b][0] > smallest)
        {
            smallestIndex = b;
            smallest = optionElements[b][0];
        }                    
    }                    
    linkbox.appendChild(optionElements[smallestIndex][1]);
    optionElements.unshift(optionElements[smallestIndex]);
}

有人能指出我的问题在哪里吗?

更新

忘了添加&gt; while循环中的符号是错误的,但不是问题的原因。

3 个答案:

答案 0 :(得分:4)

这是一个无限循环,因为unshift会将您传入的数组添加到您正在调用它的数组中。因此外部循环检查optionElements是否有多于0的项,然后在最后它变大,以便循环永远不会退出。 http://www.w3schools.com/jsref/jsref_unshift.asp

在任何情况下,我也不确定你为什么这样做。为什么不首先对optionElements数组进行排序,然后迭代一次以将每个元素添加到链接盒中?

答案 1 :(得分:2)

来自javascript unshift() function

  

unshift()方法将新元素添加到数组的开头,并返回新的长度。

这意味着你不断添加元素而不是删除它们,给你无限循环。

尝试使用计数器运行循环optionElements.length次性能更好。或者您可以使用shift()来获得所需的效果:

optionElements.shift();

:d

答案 2 :(得分:1)

我可以告诉你.unshift()在IE中不起作用。因此,如果您以前使用IE,可能需要在Mozilla / Safari中进行测试。