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

pim*_*vdb 25 javascript nan google-closure-library

goog.math.isFiniteNumberGoogle Closure Library中看到了这个功能.它做的是检查给定数字是否有限而不是NaN.

底层代码是:

goog.math.isFiniteNumber = function(num) {
  return isFinite(num) && !isNaN(num);
};
Run Code Online (Sandbox Code Playgroud)

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

但是,isFinite如果参数是,则返回false NaN.那么,检查isNaN提供了哪些优势?

kum*_*rsh 16

唯一的区别是:

!isNan(1/0) // --> true
isFinite(1/0) // --> false
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助.

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

  • 是的,你所说的一切都是正确的.`!isNaN(Infinity)=== true`,和`isFinite(Infinity)=== false`.所以,`isFinite(num)&&!isNaN(num)=== false`.这就是为什么`isNaN`检查是多余的 - "isFinite"捕获了"NaN"和"Infinity"失败案例. (3认同)
  • 因此,要回答OP的问题,*是*,“isNaN”检查是多余的。 (2认同)

Zac*_*ner -5

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

  • 我很遗憾地说,但这个答案是不正确的。这只是基于推测。 (8认同)