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



我想知道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],而不是某些控制台.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];
[];

那么,为什么第二个示例有效而不是第一个示例?对我来说似乎很奇怪。

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

问题是你的第一个 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+';'); }
<</div> div class="one_answers">

当您从数组中弹出一个项目时,数组的长度会减小,因此当您从数组中删除五个元素时index.length是 5 个,i 是 5,因此循环条件失败。
对于第二个循环,您只在从数组中删除元素之前检查数组的开头长度。

只是为了添加到评论中并用一个例子回答。

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

最新更新