[英]Javascript reduce gotcha - skips first iteration?
為什么javascript的實現會在第一次迭代時減少跳過執行?
[1,2,3].reduce((acc, val) => {
console.log('acc',acc);
console.log('val',val)
return acc + val;
});
// acc 1
// val 2
// acc 3
// val 3
// 6
我注意到第一個語句執行永遠不會運行(在這種情況下,我希望有6個控制台日志,每個元素2個)。 當我嘗試使用reduce在每次迭代中執行具有副作用的函數時,這是非常意外的行為。
在我使用過的其他語言中,傳遞的列表的每次迭代都會執行。 還有其他例子嗎?
為什么會發生這種情況,為什么javascript本機Array的實現會像這樣減少?
=========================編輯1 /解決方案===================== ===
為了確保它經歷第一次迭代,給它一個初始值(在這種情況下,第二個參數/ 0)
[1,2,3].reduce((acc, val) => { console.log('acc',acc); console.log('val',val) return acc + val; }, 0);
這是因為在每次迭代時,第一個值被視為return
值(或累加器)。
直接從這里 ,你可以看到
累加器累加回調的返回值; 它是先前在回調的最后一次調用中返回的累計值,如果提供的話,則為initialValue(見下文)。
如果我們在這里查看源代碼,我們可以看到它是如何實現的:
Array.prototype.myReduce = function(callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < this.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, this[i], i, this);
else
accumulator = this[i];
}
return accumulator;
};
在else
結構中,我們可以看到,如果值undefined
,我們將其設置為數組中i-th
索引; 對於第一次迭代,它是第一次。 之后,它成為后續迭代的回調(返回)值。
如果需要,可以回溯並檢查輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.