我想知道是否有什麼特別的關於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--;)' –