这篇文章的标题可能不合适,但是我在尝试更详细地解释我的问题时遇到了困难。该问题已解决,但我不明白为什么会发生。
我以前有以下代码:
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' ] ]
。
为什么我在第一版代码中得到了奇怪的结果?
答案 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];
}