使用isNaN(foo)和typeof foo!==数字

时间:2018-08-30 11:37:33

标签: javascript foreach

这篇文章的标题可能不合适,但是我在尝试更详细地解释我的问题时遇到了困难。该问题已解决,但我不明白为什么会发生。

我以前有以下代码:

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 :(得分:1)

isNaN("9")为假。参见docs for isNaN, under the 'confusing behaviour' section

使用typeof i !== 'number'进行检查更适合于捕获字符串,但是由于NaN,您需要同时进行两项检查以检查实际的typeof NaN === 'number'值。

答案 1 :(得分:1)

  

您应该使用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];

}