有人注意到回圈構造 forEach 和 for/of 在“迭代期間添加”項上的行為嗎?ForEach 忽略了陣列中有新添加項的事實,并且 for/of 會動態更改迭代器并繼續運行,直到陣列中沒有元素為止。這種現象的原因是什么,用聰明的詞?stackoverflow 上的第 1 篇帖子,因此無法判斷解釋是否簡單......謝謝
let my_array1 = [1,2,3]
let my_array2 = ["a", "b", "c"]
//extra iteration cycles were not dynamically added. Loop ends after pre-defined # of cycles.
my_array1.forEach((value, index, the_array) => {
if (value == 3){
// my_array1.push(3)
the_array.push(3) // works like so as well
}
})
console.log(`my_array1 after iteration ${my_array1}`)
//extra iteration cycles WERE dynamically added. Infinite loop!!!
for (let value of my_array2){
if (value == "c"){
my_array2.push("c")
}
}
console.log(`my_array2 after iteration ${my_array2}`)
uj5u.com熱心網友回復:
您必須查看規范(或者,對于非本地方法,請查看您正在使用的任何檔案的檔案)以查看行為是什么。例如,使用Array.prototype.forEach,您可以看到:
1. Let O be ? ToObject(this value).
2. Let len be ? LengthOfArrayLike(O).
3. If IsCallable(callbackfn) is false, throw a TypeError exception.
4. Let k be 0.
5. Repeat, while k < len,
a. Let Pk be ! ToString(??(k)).
b. Let kPresent be ? HasProperty(O, Pk).
c. If kPresent is true, then
i. Let kValue be ? Get(O, Pk).
ii. Perform ? Call(callbackfn, thisArg, ? kValue, ??(k), O ?).
d. Set k to k 1.
6. Return undefined.
如您所見,它迭代 while k < len,并len在操作開始時分配給,在步驟 2 中,因此不考慮在迭代期間添加到陣列的元素。(雖然會看到在迭代期間更改的元素- 因為Get(O, Pk)在每次迭代中檢索值)
for..of,另一方面,用于迭代:
Return ? GetIterator(exprValue, iteratorHint).
,然后呼叫該迭代器,直到迭代器耗盡
a. Let nextResult be ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])
和陣列迭代器確實包括在迭代期間添加到陣列的專案,您可以在此處看到。它執行
六. 將索引設定為索引 1。
在迭代的最后,在產生之后,在迭代的開始,查找該索引處的值。結果,在迭代器呼叫期間添加的元素將在迭代器的結果中看到,直到迭代器位于陣列中的最后一個元素并且沒有更多元素剩余。
uj5u.com熱心網友回復:
當您在陣列物件上呼叫 .forEach 方法時,它會將回圈結束設定為 array.length 的當前值。這將與此相同:
const arr = [1,2,3,4]
const end = arr.length
for(let i = 0; i < end; i ) {
'''code'''
}
但是,當您使用for...of它的語法時,它與此相同:
const arr = [1,2,3,4]
for(let i = 0; i < arr.length; i ) {
'''code'''
}
所以在每次迭代時,它都會檢查陣列的長度,如果你推入陣列,長度會改變
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/322601.html
標籤:javascript 循环 foreach
上一篇:如果找到則回圈并列印結果,否則再次回圈:如何擺脫Python中的多個嵌套if
下一篇:如何在回圈中反轉字串
