我想知道是否有什么特别的关于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,而不仅仅是第一次调用。
'I
Ian
正如每个人都已经评论过的,“index.length”的值每次迭代都会改变。虽然,如果你想删除一个数组的所有元素,但仍然希望这个变量是一个数组,为什么不把这个变量重新赋给一个空数组'index = [];'? –
FWIW,'for(var i = index.length; i--; i> 0)'中的第三个表达式是不必要的。第二个表达式是* always *条件。第三个表达式总是在迭代结束时执行,并且通常会推进循环变量。你只是做了一个没有做任何事情的比较,所以它相当于'for(var i = index.length; i--;)' –