2014-02-21 138 views
1

我想知道是否有什么特别的关于javaScript的pop()函数,我应该知道。为什么在for循环中使用pop()不起作用(javascript)

我的意图是编写一个程序,删除数组中的所有值,而不实际删除数组。我的第一次尝试是这样的,它并没有完全解决:

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显示错误。这是没有道理的。

在一种预感,我决定递减的循环,而是和使用它像这样:

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,而不仅仅是第一次调用。

+1

'I Ian

+0

正如每个人都已经评论过的,“index.length”的值每次迭代都会改变。虽然,如果你想删除一个数组的所有元素,但仍然希望这个变量是一个数组,为什么不把这个变量重新赋给一个空数组'index = [];'? –

+1

FWIW,'for(var i = index.length; i--; i> 0)'中的第三个表达式是不必要的。第二个表达式是* always *条件。第三个表达式总是在迭代结束时执行,并且通常会推进循环变量。你只是做了一个没有做任何事情的比较,所以它相当于'for(var i = index.length; i--;)' –

回答

1

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

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

i是5,因为这是第五个循环。所以条件i<index.length出来5<5,这是错误的。请注意0​​只是'5'!我们缩短了阵列!所以,你离开循环。如果你想要的工作,你需要到原长存储在一个变量,因此它不会对你改变每次迭代:

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

你也可以在for循环中声明长度: 'for(var i = 0,length = index.length; i

+0

这让我觉得自己有点白痴。我应该看到这一点。幸运的是,这些失误并不经常发生。再次感谢大家回答。 – lexica98

+0

@straker这并没有太大的改变。 “i”和“length”都仍然悬挂着,并且在循环之后仍然可以访问。但我同意并会做同样的事情,它不应该影响代码(除了整个存储'index.length'一次) – Ian

0

当您从阵列中弹出某个项目时,阵列的长度会减少,因此当您从阵列中删除五个元素时index.length为五,因此i为五,因此循环条件失败。
对于第二个循环,在从元素中移除元素之前,您只需检查开始时的数组长度。

+0

真正愚蠢的我谢谢。尽管如此,我仍然认为for循环中的前三个语句只执行一次,而不是每次循环都循环。 – lexica98

+1

@ Lexica98:那么'i'的比较和增量如何工作? ;) –

+0

@ Lexica98我想你需要阅读这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for – Ian

0

我想补充的意见和用一个例子回答。

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