You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript统计数组非NaN元素结果异常,isNaN为何不生效?

问题:统计数组中非NaN值的数量出错

需求:遍历data数组,统计其中非NaN值的数量。我的解决方案如下:

let data = [11, null, NaN, 'Hello', 24]

let check = 0;

for (item in data) {
  if (isNaN(item) == false) {
    check +=1
  };
};

console.log(check);

实际运行结果为5,但正确结果应为2。我认为isNaN()函数会返回布尔值,请问这段代码为何无法正常工作?


错误原因拆解

  1. 遍历对象错了:for...in遍历数组时,item拿到的是数组的索引(比如'0'、'1'这类字符串形式的下标),不是数组里的实际元素。你判断的是“索引是不是NaN”——但所有索引都是字符串数字,isNaN('0')肯定返回false,所以每次循环都加1,最后得到5。
  2. isNaN的逻辑不符合真实需求:你说正确结果是2,说明你其实想统计的是数组里的数字类型且非NaN的值(也就是11和24),而不是所有非NaN值(原数组里非NaN的有4个:11、null、'Hello'、24)。就算你遍历到了元素,传统的isNaN()会强制把参数转成数字,比如isNaN(null)返回false(因为null转成0),这也会把null算进去,不符合你的预期。
  3. 传统isNaN的设计缺陷:isNaN()会先把输入转为数字,导致很多非NaN的值被误判成NaN(比如isNaN('Hello')返回true,但'Hello'本身不是NaN)。要准确判断一个值是不是NaN,应该用Number.isNaN(),它不会强制转换类型,只有当值确实是NaN时才返回true。

正确实现代码

统计数字类型的非NaN值(结果为2)

let data = [11, null, NaN, 'Hello', 24]
let check = 0;

// 用for...of遍历数组的实际元素
for (const item of data) {
  // 先判断是数字类型,再排除NaN
  if (typeof item === 'number' && !Number.isNaN(item)) {
    check += 1;
  }
};

console.log(check); // 输出2

统计所有非NaN值(结果为4)

let data = [11, null, NaN, 'Hello', 24]
let check = 0;

for (const item of data) {
  // 用Number.isNaN准确判断是否为NaN,取反统计非NaN
  if (!Number.isNaN(item)) {
    check += 1;
  }
};

console.log(check); // 输出4

内容的提问来源于stack exchange,提问作者Mustafa Anandwala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:15:57