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()函数会返回布尔值,请问这段代码为何无法正常工作?
错误原因拆解
- 遍历对象错了:
for...in遍历数组时,item拿到的是数组的索引(比如'0'、'1'这类字符串形式的下标),不是数组里的实际元素。你判断的是“索引是不是NaN”——但所有索引都是字符串数字,isNaN('0')肯定返回false,所以每次循环都加1,最后得到5。 - isNaN的逻辑不符合真实需求:你说正确结果是2,说明你其实想统计的是数组里的数字类型且非NaN的值(也就是11和24),而不是所有非NaN值(原数组里非NaN的有4个:11、null、'Hello'、24)。就算你遍历到了元素,传统的
isNaN()会强制把参数转成数字,比如isNaN(null)返回false(因为null转成0),这也会把null算进去,不符合你的预期。 - 传统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
相关产品推荐
相关产品推荐

