JavaScript NaN与Infinity特殊值详解

作者:半夏

时间:2026-10-27

浏览:470

本文深入解析JavaScript中NaN和Infinity两个特殊数值。NaN表示非数字,虽类型为number但自身不等,需通过isNaN或ES6的Number.isNaN检测。Infinity由除以零产生,涉及复杂的算术运算规则。文章提供了多种检测方法与代码示例,帮助开发者正确处理边界情况。

文章目录
What is {} + {} in JavaScript?

NaN的特殊性质与检测

在JavaScript语言中,NaN(Not a Number)用于表示“非数字”这一状态。该值通常出现在字符串解析失败等错误场景中。


具体示例如下:

 
> Number("xyz")
NaN


尽管其名称意为“非数字”,但从逻辑上看,它也可以被理解为“非非数字”。


验证代码如下:

 
> NaN !== NaN
true

NaN确实属于数字类型,其类型标识为"number"。


类型检查代码如下:

 
> typeof NaN
'number'

1.1 检测NaN

在JavaScript中,NaN是唯一一个不等于自身的值。因此,无法直接使用等号运算符来判断变量是否为NaN,但可以使用全局函数isNaN()来实现这一目的。


测试代码如下:

 
> isNaN(NaN)
true

Kit Cambridge指出isNaN()存在一个潜在问题:它会对参数进行隐式类型转换。因此,即使传入的是无法转换为数字的字符串,函数也会返回true(因为转换结果为NaN)。

示例代码如下:

 
> Number("xyz")
NaN
> isNaN("xyz")
true


基于相同的原因,isNaN()对许多其他对象也会返回true。


测试代码如下:

 
> Number({})
NaN
> isNaN({})
true
> Number(["xzy"])
NaN
> isNaN(["xzy"])
true

对于重写了valueOf方法的自定义对象,情况同样如此。


示例代码如下:

 
> var obj = { valueOf: function () { return NaN } };
> Number(obj)
NaN
> isNaN(obj)
true

鉴于NaN是唯一满足(x !== x)不等式的值,我们可以据此编写自定义的isNaN函数,从而避免上述隐式转换带来的问题。


实现代码如下:

 
function myIsNaN(x) {
return x !== x;
} 

目前,ECMAScript 6中已添加修正版的isNaN方法Number.isNaN()(译者注:Firefox浏览器已实现此功能)。该方法由Crockford实现,比上述myIsNaN更易于理解,其核心代码逻辑如下:


示例代码如下:

 
Number.isNaN = function (value) {
return typeof value === 'number' && isNaN(value);
}; 


2.Infinity

Infinity的产生与运算规则

使用0作为除数会产生另一个特殊值Infinity。


测试代码如下:

 
> 3/0
Infinity

不能简单地猜测正无穷大或负无穷大的计算结果。


示例代码如下:

 
>Infinity - Infinity
NaN

比无穷大更大的值仍然是无穷大。



示例代码如下:

 
> Infinity + Infinity
Infinity > 5 * Infinity
> 5 * Infinity


3.参考

Infinity

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章