我遇到了Google Closure Library中的goog.math.isFiniteNumber
函数。它的作用是检查给定数字是否有限而不是NaN
。
底层代码是:
goog.math.isFiniteNumber = function(num) {
return isFinite(num) && !isNaN(num);
};
因此,首先它使用原生isFinite
函数检查数字是否有限,然后进行额外检查以确保使用NaN
编号不是isNaN
。< / p>
但是,如果参数为isFinite
,NaN
已经返回false。那么,isNaN
的检查有哪些优势呢?
答案 0 :(得分:14)
唯一的区别是:
!isNan(1/0) // --> true
isFinite(1/0) // --> false
isNaN检查参数是否为数字。无穷大(+/-)也是数字,因此它们通过了isNaN检查,但没有通过isFinite检查。
**请注意,任何可以解析为数字(“2”,“3.14”)的字符串都会导致isNaN返回false。
希望这有帮助。
PS:user1170379给出的答案非常接近完美。
答案 1 :(得分:2)
你可以在阅读之后推断出[为什么?]:
NaN不检查传递的值是否为无穷大 - 它检查输入值是否计算为“Type:Number”最终结果。因为isNaN(字符串)被接受,所以:isNaN(“3.14”)// false(这意味着是真的,给定的标记被鸭子转换成类型号成功)
您可能会理解输入值可能恰好是未解析的粗略数字,即使是数学运算也很简单: (X / Y);这反过来可能产生(+/-无穷大)数字。
这里x = 1,y = 0;意思是(1/0)。然后是NaN(x / y)将首先评估为isNaN(1/0);然后到 isNaN(无穷大)//假。由于(1/0)= infinity的类型为:“number”,即typeof(1/0)//“number”isNaN应该并且将返回false。
您不希望将“无穷大”放在期望最终结果编号的位置。
答案 2 :(得分:1)
可能出于同样的原因,我已经实现了(isfinite(num) && isfinite(-num))
- 我收到了mysql的错误抱怨将“-nan”放入数据库,即使我检查了isfinite(field)
... < / p>
有关此主题的有用文章是http://jacksondunstan.com/articles/983,它提供了优化((d*0.0)==0.0)
答案 3 :(得分:0)
isNaN()返回true。否则返回false。
示例:isNaN(0/0) =>true;
isNaN(2-1) =>false;
如果参数是NaN,Infinity或-Infinity以外的数字,则isFinite()返回true。否则返回false。
示例:isFinite("2000") =>false;
isFinite(200/2)=&gt; true;`
答案 4 :(得分:-4)
如果isFinite
按isFiniteNumber
的方式工作,则没有理由编写isFiniteNumber。那里可能有一些浏览器将NaN视为有限的。