JavaScript NaN与Infinity特殊值详解
本文深入解析JavaScript中NaN和Infinity两个特殊数值。NaN表示非数字,虽类型为number但自身不等,需通过isNaN或ES6的Number.isNaN检测。Infinity由除以零产生,涉及复杂的算术运算规则。文章提供了多种检测方法与代码示例,帮助开发者正确处理边界情况。
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 * Infinity3.参考
Infinity
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
