JavaScript过滤NaN不能用===或==,须用Number.isNaN()或x===x技巧;前者精准检测NaN,后者利用NaN≠NaN特性;去重时Set等自动合并NaN,但剔除仍需filter。

JavaScript 中过滤数组里的 NaN 不能靠 === 或 == 判断,因为 NaN === NaN 恒为 false。必须用专门的检测方式,再结合过滤逻辑才能可靠剔除或保留。
用 Number.isNaN() 做精准判断
这是现代 JS 推荐的方式:只对真正是 NaN 的值返回 true,不进行类型转换,避免误判。
-
Number.isNaN("abc")→false(字符串不是 NaN) -
Number.isNaN(NaN)→true -
Number.isNaN(0/0)→true
过滤示例:
const clean = arr.filter(item => !Number.isNaN(item));
// [1, 2, "hello", null]
利用 NaN 不等于自身的特性
这是一个轻量、无需调用函数的技巧:NaN !== NaN 为 true,而其他所有合法值都满足 x === x。
立即学习“Java免费学习笔记(深入)”;
-
NaN === NaN→false -
5 === 5→true -
"a" === "a"→true
过滤示例:
const arr = [NaN, 1, 2, NaN, undefined];const clean = arr.filter(x => x === x);
// [1, 2, undefined]
注意:这个方法会同时剔除 NaN,但保留 undefined、null、false 等“假值”——它们自身是可比较的。
区分过滤目标:只去 NaN,还是连带 null/undefined?
实际业务中,常需一并清理无效值。若想同时排除 null、undefined、NaN,可用组合判断:
const validNumbers = arr.filter(x =>
typeof x === 'number' && !Number.isNaN(x)
);
// [1, 0, 42] —— 只留有效数字
若想保留非数字但有意义的值(如字符串、对象),只剔 NaN:
const safeFilter = arr.filter(x =>!(typeof x === 'number' && Number.isNaN(x))
);
// [1, 0, "", false, null, undefined, 42]
在去重场景中特别处理 NaN
普通去重方法(如 Set、indexOf、includes)能正确识别并保留一个 NaN,因为 ES6 规范明确要求 Set 和 Map 把多个 NaN 视为相同键。
-
[...new Set([NaN, 1, NaN])]→[NaN, 1] -
[1, NaN, 2, NaN].filter((x, i, a) => a.indexOf(x) === i)→[1, NaN, 2]
但注意:这些方法不解决“是否要保留 NaN”的业务问题,只是按规范做了唯一性收敛。是否剔除,仍需额外 filter 步骤。


















