2014-02-21 136 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+';'); } 
相關問題