3 回答

TA貢獻1830條經驗 獲得超9個贊
正如MDN 文檔中非常清楚地描述的那樣,該.forEach()方法在迭代開始之前確定將涉及的元素。
如果元素被添加到數組中,它們將不會被包含在迭代中。如果刪除元素,則將跳過后續元素?;旧嫌幸粋€用于選擇每個元素的內部索引,因此如果數組變短,則無法相應地調整該索引。
最重要的是,您編寫的代碼使得.forEach()回調忽略它的參數。它總是只去掉fruits數組的第一個元素。因此,在第一次迭代時,您會得到“Apple”,而數組現在只有三個元素。下一個迭代的元素將是“Mango”,而不是“Banana”,但因為代碼沒有注意item你得到源數組的第一個新元素。之后,數組只有兩個項目,因此迭代終止。
您將看到與此代碼完全相同的效果,這可能更清晰,因為該機制是可見的:
const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']
const fruitsList = []
for (let index = 0, len = fruits.length; index < len; index++) {
if (index in fruits) {
let fruit = fruits.splice(0,1)
fruitsList.push(fruit)
}
}
該if循環中的測試說明了一個重要的.forEach()行為:它跳過空數組的索引(即從未初始化為值的索引)。從 中.slice()刪除元素的調用fruits,因此在前兩次迭代之后,它甚至不會再嘗試執行任何.slice()調用,因為索引 2 和 3 將為空。
這樣做的正確方法,如果它是真正的代碼,將是
const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']
const fruitsList = fruits.map(function(fruit) {
return [fruit];
});
fruits = []; // if you really want to empty it out
(而且=>函數會更簡潔。)

TA貢獻1818條經驗 獲得超7個贊
Splice 修改源數組。
splice() 方法通過刪除或替換現有元素和/或在適當位置添加新元素來更改數組的內容。
來源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
這意味著當splice()
應用于forEach()
正在迭代的數組時,它被修改(變短),因此一段時間后它沒有元素可以迭代。

TA貢獻1856條經驗 獲得超17個贊
如果您看到每次迭代后所擁有的是從水果中刪除的數組,并且您將該數組推送到新列表中,那么您正在以錯誤的方式改變原始數組。
使用這種方法,您將保持索引完好無損,在拼接突變期間不會發生變化。
const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']
const fruitsList = []
function removeArrayItem(item,index){
let fruit = fruits.splice(index,1,'')
fruitsList.push(fruit)
}
fruits.forEach(removeArrayItem)
console.log(fruitsList)
https://codepen.io/psyNiiM/pen/JjjNRaJT
添加回答
舉報