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

问题描述 投票:0回答:6

我在

Google Closure Library
中发现了 goog.math.isFiniteNumber 函数。它的作用是检查给定的数字是否是有限的且不是
NaN

底层代码是:

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

因此,首先它使用原生

isFinite
函数检查该数字是否是有限的,然后使用
NaN
进行额外检查以确保该数字不是
isNaN

但是,如果参数为

isFinite
,则
NaN
已经返回 false。那么,检查
isNaN
有什么好处呢?

javascript nan google-closure-library
6个回答
24
投票

唯一的区别是:

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

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

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

希望这有帮助。

PS:用户1170379给出的答案非常接近完美。


3
投票

读完本文后你可能会推理出[为什么?]:

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

您可能会理解,输入值可能碰巧是一个无法解析的原始数字,即使是像下面这样简单的数学运算: (x/y); 这反过来可能会产生一个(+/-无穷大)数字。

这里x=1,y=0;意思是 (1/0)。那么 isNaN(x/y) 首先会计算为 isNaN(1/0);然后到 isNaN(无穷大) //假。由于 (1/0)=infinity 的类型为: "number" ie typeof(1/0) //"number" isNaN 应该并且将会返回 false。

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


1
投票

可能与我实现

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

关于此主题的一篇有用文章是http://jacksondunstan.com/articles/983,它提供了优化

((d*0.0)==0.0)


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;`


0
投票

const infiniteNumber = 1/0;
const x = () => {
  return isFinite(infiniteNumber) && !isNaN(infiniteNumber);
};

const y = () => {
  return isFinite(infiniteNumber);
};

const z = () => {
  return !isNaN(infiniteNumber);
};

const t = () => {
  return !isNaN(null);
};

const c = () => {
  return isFinite(null);
};

const u = () => {
  return !isNaN(undefined);
};

const v = () => {
  return isFinite(undefined);
};

console.log(x(),y(),z(),t(),c(),u(),v())

这可能会有帮助


-5
投票

如果

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

© www.soinside.com 2019 - 2024. All rights reserved.