为什么在isFinite()之后检查!isNaN()?

时间:2011-04-16 22:29:08

标签: javascript nan google-closure-library

我遇到了Google Closure Library中的goog.math.isFiniteNumber函数。它的作用是检查给定数字是否有限而不是NaN

底层代码是:

goog.math.isFiniteNumber = function(num) {
  return isFinite(num) && !isNaN(num);
};

因此,首先它使用原生isFinite函数检查数字是否有限,然后进行额外检查以确保使用NaN编号不是isNaN。< / p>

但是,如果参数为isFiniteNaN已经返回false。那么,isNaN的检查有哪些优势呢?

5 个答案:

答案 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)

如果isFiniteisFiniteNumber的方式工作,则没有理由编写isFiniteNumber。那里可能有一些浏览器将NaN视为有限的。