Javascript уменьшить число ошибок - пропускает первую итерацию? - PullRequest
0 голосов
/ 09 сентября 2018

Почему реализация 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 уменьшается так?

========================= РЕДАКТИРОВАТЬ 1 / Решение ================== ======
Чтобы убедиться, что он проходит первую итерацию, присвойте ему начальное значение (2-й аргумент здесь / 0 в данном случае)

[1,2,3].reduce((acc, val) => { console.log('acc',acc); console.log('val',val) return acc + val; }, 0);

1 Ответ

0 голосов
/ 09 сентября 2018

Это связано с тем, что на каждой итерации первое значение обрабатывается как значение return (или аккумулятор).

Прямо с здесь , вы можете увидеть

Аккумулятор накапливает возвращаемые значения обратного вызова; это накопленное значение, ранее возвращенное в последнем вызове callback или 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 в массиве; которая для первой итерации является первой. После этого оно становится значением обратного вызова (возврата) последующих итераций.

Если вы хотите, вы можете вернуться и проверить вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...