为什么在for循环中使用pop()不起作用(javascript)

时间:2014-02-21 22:30:53

标签: javascript arrays indexing pop

我想知道javaScript的pop()函数是否有什么特别之处我应该知道。

我的目的是编写一个程序来擦除数组中的所有值,而不实际删除数组。我的第一次尝试就是这个,但并没有完全成功:

var index = [1,2,3,4,5,6,7,8,9,10];

for(var i=0;i<index.length;i++) { index.pop(); console.log(index+';'); }

// outputs this:

[1,2,3,4,5,6,7,8,9];
[1,2,3,4,5,6,7,8];
[1,2,3,4,5,6,7];
[1,2,3,4,5,6];
[1,2,3,4,5];

然后它就停在那里。咦?检查后,我发现该数组确实是[1,2,3,4,5],而不是某些console.log显示错误。哪个没有意义。

在预感中,我决定减少for循环,并像这样使用它:

var index = [1,2,3,4,5,6,7,8,9,10];

for(var i=index.length; i--; i>0) { index.pop(); console.log(index+';'); }

// and for some reason, this works:

[1,2,3,4,5,6,7,8,9];
[1,2,3,4,5,6,7,8];
[1,2,3,4,5,6,7];
[1,2,3,4,5,6];
[1,2,3,4,5];
[1,2,3,4];
[1,2,3];
[1,2];
[1];
[];

那么,为什么第二个例子有效而不是第一个?对我来说似乎很奇怪。 (我有时会嘲笑javaScript有多荒谬)!!!

谢谢!

编辑:我不知道for循环每次都查找index.length,而不仅仅是第一次调用它。

3 个答案:

答案 0 :(得分:2)

问题是你的第一个for循环正在查看index.length。它不断变化,因为阵列越来越小!所以在五个循环之后,你的数组是:

[1,2,3,4,5];

i是5,因为这是第五个循环。因此条件i<index.length出现在5<5,这是错误的。请注意,index.length仅为“5”!我们缩短了阵列!所以,你离开了循环。如果你想让它工作,你需要将原始长度存储在变量中,这样每次迭代都不会改变:

var original_length = index.length;
for(var i=0;i<original_length;i++) { index.pop(); console.log(index+';'); }

答案 1 :(得分:0)

当你从数组中弹出一个项目时,数组的长度会减少,所以当你从数组index.length中删除了五个元素时,它是5,而我是5,因此循环条件失败。
对于第二个循环,您只需在开始时检查数组的长度,然后再从中删除元素。

答案 2 :(得分:0)

只需添加评论并回答一个例子。

var l = index.length
for(var i=0;i<l;i++) { index.pop(); console.log(index+';'); }