.forEach возвращает неожиданные результаты при использовании isNaN (foo) и typeof foo! == число - PullRequest
0 голосов
/ 30 августа 2018

Название этого поста может быть неуместным, но у меня возникают трудности при попытке объяснить мою проблему более подробно. Указанная проблема была исправлена, но я не понимаю, почему это произошло.

У меня ранее был этот код:

var SumElements = (arr) => {
    let count = 0;
    let ignored = [];

    arr.forEach(i => {
        if(isNaN(i)) {
            ignored.push(i);
            return;
        }

        count = count + i;
        console.log(count);
    });

    return [count, ignored];

}

Это был мой тестовый пример: console.log(SumElements([3, "f", 3, "9", "o", 3, 1]));

Выход:

3
6
69
693
6931
[ '6931', [ 'f', 'o' ] ]

Ожидаемый результат: [10, ['f', '9', 'o']].

Я изменил isNaN(i) на typeof i !== "number", и результат был ожидаемым [ 10, [ 'f', '9', 'o' ] ].

Почему я получил странные результаты при первой редакции кода?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы должны использовать count = count + Number(i);

потому что forEach возвращает индекс в строковом формате

var SumElements = (arr) => {
    let count = 0;
    let ignored = [];

    arr.forEach(i => {
        console.log(typeof i); // "string" not ok(

        i = Number(i); // because forEach return index in string

        console.log(typeof i); // "number" ok

        if(isNaN(i)) {
            ignored.push(i);
            return;
        }

        count = count + i; 
        console.log(count);
    });

    return [count, ignored];

}
0 голосов
/ 30 августа 2018

isNaN("9") ложно. См. документы для isNaN, в разделе «Непонятное поведение» 100 .

Проверка с помощью typeof i !== 'number' лучше для перехвата строк, но вам нужно сделать и то и другое, чтобы проверить фактическое значение NaN, потому что typeof NaN === 'number'.

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