簡體   English   中英

Javascript reduce gotcha - 跳過第一次迭代?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM