29

我在Google Closure Library中遇到了这个goog.math.isFiniteNumber函数。它所做的是检查给定数字是否既是有限的又不是。NaN

底层代码是:

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

因此,首先它使用本机函数检查数字是否是有限的isFinite,然后进行额外检查以确保该数字没有NaN使用isNaN.

但是,isFinite如果参数是 ,则已经返回 false NaN。那么,支票isNaN提供了哪些优势呢?

4

5 回答 5

21

唯一的区别是:

!isNan(1/0) // --> true
isFinite(1/0) // --> false

isNaN 检查参数是否为数字。Infinities (+/-) 也是数字,因此它们通过 isNaN 检查,但不通过 isFinite 检查。

** 请注意,任何可以解析为数字(“2”、“3.14”)的字符串都会导致 isNaN 返回 false。

希望这可以帮助。

PS:user1170379给出的答案非常接近完美。

于 2013-05-30T15:47:49.313 回答
2

阅读此内容后,您可能会推理出[为什么?]:

NaN 不检查传递的值是否为无限 - 它检查输入 val 的计算结果是否为“类型:数字”最终结果。因为 isNaN(string) 被接受,所以:isNaN("3.14") //false(表示true,给定的token被duck成功转换为Number类型)

您可能会理解,输入值可能恰好是一个未解析的粗略数字,甚至是简单的数学运算: (x/y); 这反过来可能会产生一个(+/-无穷大)数。

这里x=1,y=0;意思是 (1/0)。然后 isNaN(x/y) 将首先评估为 isNaN(1/0); 然后到 isNaN(infinity) //false。由于 (1/0)=infinity 的类型为:"number" ie typeof(1/0) //"number" isNaN 应该并且将返回 false。

您不想将“无穷大”放在预期的最终结果数字的位置。

于 2012-01-26T00:11:30.083 回答
1

可能与我实施的原因相同(isfinite(num) && isfinite(-num))- 我从 mysql 收到错误,抱怨将“-nan”放入数据库,即使我检查了isfinite(field)...

关于这个主题的有用文章是http://jacksondunstan.com/articles/983,它提供了优化((d*0.0)==0.0)

于 2011-09-20T23:25:53.737 回答
1

如果参数不是数字或参数是非数字值(例如字符串或对象),isNaN() 返回 true。否则,返回 false。示例:isNaN(0/0) =>true; isNaN(2-1) =>false; 如果参数是 NaN、Infinity 或 -Infinity 以外的数字,isFinite() 返回 true。否则,它返回 false。示例:isFinite("2000") =>false; isFinite(200/2) =>true;`

于 2014-08-06T07:07:53.320 回答
-5

如果isFinite按照这种方式工作isFiniteNumber,那么就没有理由写 isFiniteNumber。可能有一些浏览器将 NaN 视为有限的。

于 2011-04-16T23:02:54.850 回答