判断nan应首选number.isnan(),因其语义准确、不转换类型;次选value !== value,虽高效但可读性差;避免使用全局isnan(),因其会强制转换导致误判;实际业务中推荐组合typeof x === "number" && isfinite(x)确保数值有效性。

JavaScript 中判断 NaN 不能用 === 或 ==,因为 NaN !== NaN 恒为 true。真正有效的检测必须利用其数学本质或现代标准 API,性能差异虽小,但语义准确性和上下文适配性远比微秒级耗时更重要。
Number.isNaN():语义最准、推荐首选
ES6 标准方法,不进行任何类型转换,仅当参数是严格意义上的 NaN(即类型为 "number" 且值为 NaN)时返回 true。
- ✅ 安全:不会把
"abc"、null、{}等误判为 NaN - ✅ 明确:只回答“是不是真 NaN”,不是“能不能转成数字”
- ✅ 性能:Chrome 下约 200 万次/秒,开销极低,适合高频校验
- ❌ 不兼容 IE 等老环境(需 polyfill 或降级处理)
value !== value:零依赖、底层高效
利用 NaN 是唯一一个不等于自身的 JavaScript 值这一特性,直接用自反比较。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 极快:无函数调用、无原型查找,接近原生操作速度
- ✅ 兼容:所有引擎都支持,可用于 polyfill 或工具库底层
- ❌ 可读性差:“
x !== x是 NaN?”需要注释说明,易被误读 - ❌ 语义隐晦:对团队协作或维护不友好,不建议业务代码直写
isNaN():慎用,易误判
全局函数,会先调用 Number(value) 强制转换再判断,本质是“是否无法转为有效数字”。
- ⚠️ 误报常见:
isNaN("abc")、isNaN({})、isNaN(undefined)都返回true - ⚠️ 逻辑错位:
isNaN("123px")→false(因Number("123px") === 123),但你可能想拒绝它 - ✅ 仅适用于“宽松数字输入校验”场景,比如表单初筛
- ✅ 性能尚可(约 350 万次/秒),但代价是语义失真
组合式数字有效性检查更实用
多数业务真正需要的不是“是不是 NaN”,而是“这个值能否安全参与计算”。此时应组合判断:
-
typeof x === "number":排除字符串、对象、null 等非数值类型 -
isFinite(x):一步过滤掉NaN、Infinity、-Infinity - 封装示例:
const isValidNumber = x => typeof x === "number" && isFinite(x); - 该组合在 Chrome 中性能约 180 万次/秒,语义清晰、覆盖全面、无副作用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










