2015-12-15 73 views
-1

此代碼只打印數字,直到3時,它應該打印數字,直到5,有什麼不對?代碼打印數字直到3時,它應該打印,直到5

function reversingwithout (array){ 
    for(var i=0;i<array.length;i++){ 
     var old = array.shift(array[i]) 
     console.log(old); 
    } 
} 

var hh = [1,2,3,4,5]; 
reversingwithout(hh); 
+1

'Array.prototype.shift'不帶任何參數。 – MinusFour

+0

提示:當你使用shift()方法時,你正從數組中移除元素。 –

回答

1

這是因爲array.shift操作正在改變循環內的數組。

Array.prototype.shift

移位()方法從陣列中移除的第一個元素,並返回 該元素。此方法更改數組的長度。

嘗試保存數組長度在一個變量中預先:

var hh = [1,2,3,4,5]; 
var length = hh.length; 
function reversingwithout (array){ 
    for(var i=0;i<length;i++){ 
     var old = array.shift() 
     console.log(old); 
    } 
} 

reversingwithout(hh); 

還要注意,array.shift不需要參數。

JSBin:https://jsbin.com/paleyifija/1/edit?html,console,output

1

見循環條件的迭代中如何變化:

  1. i == 0array.length == 5。 OK
  2. i == 1array.length == 4。好吧
  3. i == 2array.length == 3。好吧
  4. i == 3array.length == 2。 End loop

我想你誤會了shift。如果你只想打印所有項目,只是像做

for(var i=0; i<array.length; ++i) console.log(array[i]); 
0

的shift()方法刪除數組的第一個元素並返回該元素。此方法更改數組的長度。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

array.length值每個的環路保護檢查時間計算的。當調用Array.shift()時,循環體從數組中刪除一個元素,從而減少數組的長度。因此,在循環退出時,i == 3array.length == 2

可以通過在變量存儲array.length的初始值,並使用該變量中的環路保護,而不是解決這個問題。

例如

var len = array.length; 
for (var i = 0; i < len; i++) { ...