JavaScript数学运算:操作符、Math对象与特殊值处理
本文介绍JavaScript中通过操作符和Math对象进行数学运算的方法。重点解析溢出、除以0及负数开方等合法但产生特殊值的情况,详细阐述Infinity、正负0及NaN的定义与行为。同时提供isNaN()、isFinite()等全局函数的使用技巧与类型判断建议,并附完整测试代码。
JavaScript数学运算基础与特殊值机制
在JavaScript中,执行数学计算主要依赖两种方式:
一是使用基础的算术操作符,包括加(+)、减(-)、乘(*)、除(/)和取模(%);二是调用Math对象提供的专用计算函数,例如使用Math.pow(2,3)来计算2的3次方。
与Java语言不同,JavaScript在执行数学运算时不会抛出异常错误。即使发生数值溢出、除以0或对负数进行开方等操作,这些行为在JavaScript中也是合法的,其结果会返回特定的特殊值:正负Infinity(无限大)、正负0以及NaN(非数字)。
首先是正负Infinity。当计算结果超过JavaScript能表示的最大数值(Number.MAX_VALUE)时,返回正Infinity;若结果小于最小数值(-Number.MAX_VALUE),则返回负Infinity。涉及Infinity的加减乘除运算遵循高等数学中的极限规则。例如,1/0的结果是正Infinity,而-1/0的结果则是负Infinity。
其次是正负0。当计算结果为正数但小于JavaScript能表示的最小正小数(Number.MIN_VALUE)时,结果为正0;若结果为负数但大于JavaScript能表示的最大负小数(-Number.MIN_VALUE)时,结果为负0。通常情况下,开发者无需区分正负0之间的细微差别。
最后是NaN。对于某些无法用正负Infinity表示的特殊计算结果,JavaScript使用NaN来表示(需注意,尽管NaN字面意为“非数”,但其数据类型仍为number)。这些特殊情况包括:
1). 0除以0。 2). Infinity除以Infinity。 3). 对负数进行开方运算。 4). 对非数值字符串执行数值转换操作。
Infinity和NaN既是打印输出的特殊值,也是JavaScript中的全局变量名。在ECMAScript 3标准中,这两个全局变量可被重新赋值;但ECMAScript 5修正了这一规则,将其设为只读。除了直接访问Infinity和NaN变量,还可以通过Number对象的成员属性来获取这两个特殊值:
1. Infinity与Number.POSITIVE_INFINITY等价。 2. -Infinity与Number.NEGATIVE_INFINITY等价。 3. NaN与Number.NaN等价。
在JavaScript中,NaN是一个具有独特属性的特殊值:它与任何值(包括其自身)都不相等。判断一个值是否为NaN,主要有两种方法:
1. 检查表达式x!=x是否为true。该表达式仅在x为NaN时返回true。
2. 调用全局函数isNaN(),判断isNaN(x)是否为true。然而,这种方法判定NaN并不严谨,因为在以下4种情况下,表达式isNaN(x)均会返回true:
1). x本身为NaN。 2). x为字符串,且该字符串无法转换为有效数字。 3). x为对象。 4). x为undefined。
除了isNaN(),JavaScript还提供了另一个有用的全局函数:isFinite()。对于变量a,在以下几种情况下isFinite(a)返回true:
1). a为number类型,但不是NaN或正负Infinity。 2). a为字符串,且该字符串内容可转换为非NaN、非正负Infinity的数字。 3). a为null。 4). a为布尔值。
由于null、undefined等非数值类型会影响判断结果,建议在调用isNaN()或isFinite()之前先对参数类型进行判断。
数学运算特殊值测试代码
实验
代码如下:
//Test Infinity
var a = Number.MAX_VALUE;
console.log(a*1.1);//Infinity
console.log(a*-1.1);//-Infinity
console.log(1/0);//Infinity
console.log(-1/0);//-Infinity
//Test positive/negative 0
var b = Number.MIN_VALUE;
console.log(b/2);//0
console.log(-b/2);//0
//Test NaN
console.log(0/0);//NaN
console.log(Infinity/Infinity);//NaN
console.log(Math.sqrt(-1));//NaN
console.log(parseInt("string"));//NaN
//Test Infinity comparison
console.log(Infinity === Number.POSITIVE_INFINITY);//true
console.log(-Infinity === Number.NEGATIVE_INFINITY);//true
//Test NaN comparison
console.log(NaN === NaN);//false
//Test isNaN()
console.log(isNaN(NaN));//true
console.log(isNaN("42"));//false
console.log(isNaN("string"));//true
console.log(isNaN({}));//true
console.log(isNaN(undefined));//true
console.log(isNaN(null));//false
//Test isFinite()
console.log(isFinite(42));//true
console.log(isFinite(Infinity));//false
console.log(isFinite(NaN));//false
console.log(isFinite("29"));//true
console.log(isFinite("string"));//false
console.log(isFinite(null));//true
console.log(isFinite(undefined));//false
console.log(isFinite(true));//true
console.log(isFinite(false));//true什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
