Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要检查!isNaN()在isFinite()之后?_Javascript_Nan_Google Closure Library - Fatal编程技术网

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

Javascript 为什么要检查!isNaN()在isFinite()之后?,javascript,nan,google-closure-library,Javascript,Nan,Google Closure Library,我在中遇到了goog.math.isFiniteNumber函数。它所做的是检查给定的数字是否是有限的,而不是NaN 基本代码是: goog.math.isFiniteNumber = function(num) { return isFinite(num) && !isNaN(num); }; 因此,它首先使用本机的isFinite函数检查数字是否有限,然后使用isNaN进行额外检查以确保数字不是NaN 但是,isFinite在参数为NaN的情况下已经返回false。那么

我在中遇到了
goog.math.isFiniteNumber
函数。它所做的是检查给定的数字是否是有限的,而不是
NaN

基本代码是:

goog.math.isFiniteNumber = function(num) {
  return isFinite(num) && !isNaN(num);
};
因此,它首先使用本机的
isFinite
函数检查数字是否有限,然后使用
isNaN
进行额外检查以确保数字不是
NaN


但是,
isFinite
在参数为
NaN
的情况下已经返回false。那么,
isNaN
的检查有什么好处呢?

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

可能是因为我实现了
(isfinite(num)和&isfinite(-num))
-我从mysql收到错误,抱怨将“-NaN”放入数据库,尽管我检查了
isfinite(field)


关于这个主题的一篇有用的文章是,它提供了一个优化
((d*0.0)=0.0)

阅读此文后,您可能会推断出[为什么?]:

NaN不检查传递的值是否为无限-它检查输入值是否计算为“Type:Number”最终结果。因为接受了isNaN(string),所以:isNaN(“3.14”)//false(这意味着true,将给定的标记成功地转换为类型号)

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

这里x=1,y=0;意思是(1/0)。然后isNaN(x/y)将首先计算为isNaN(1/0);然后 isNaN(无穷大)//错误。因为(1/0)=无穷大是一种类型:“number”即typeof(1/0)/“number”应该并将返回false


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

唯一的区别是:

!isNan(1/0) // --> true
isFinite(1/0) // --> false
isNaN检查参数是否为数字。无穷大(+/-)也是数字,因此它们通过了isNaN检查,但没有通过isFinite检查

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

希望这有帮助

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

isNaN()如果参数不是数字或参数是非数值,如字符串或对象,则返回true。否则,返回false。 示例:
isNaN(0/0)=>true
isNaN(2-1)=>false
如果参数不是NaN、无穷大或-Infinity,isFinite()将返回true。否则,它将返回false。
示例:
isFinite(“2000”)=>false

isFinite(200/2)=>真`

我想你应该问问代码的作者。我最好的猜测是,一些有缺陷的(旧的?)浏览器将
NaN
视为有限的,并且双重检查只是为了兼容性。可能是一些模糊的浏览器(或其他javascript实现)弄错了,程序员假设isFinite只测试+/-无穷大,或者程序员只是指定一个额外的检查作为预防措施。我想知道它可能是哪一个。Chrome/IE9/Firefox/Opera都表现正常。也许是IE6,但我想
isFinite
函数在所有情况下都是足够的。微软声称IE6支持它:很抱歉,这个答案是不正确的。这仅仅是基于猜测。这个答案可能是猜测,但它确实解决了实际问题,即根据定义,isNaN隐含在isFinite中。isNaN调用应该是毫无意义的——除非浏览器出现了实现错误。但我怀疑这是一个关闭错误。我在Google中找不到任何破坏isFinite实现的例子,值得注意的是,在同一文件的其他地方,他们对任何传递isFinite的值必须是数字的假设感到满意:
goog.math.isInt=function(num){return isFinite(num)&&num%1==0;}(虽然我检查过的所有实现似乎都在isFinite中使用isNaN,但正如预期的那样,isNaN本身非常奇怪——例如“”的计算结果为零。这就是下划线使用
。.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj));}的原因。
typeof
isNaN
有什么关系
isNaN
仅在传递强制为与IEEE-754 NaN对应的数值的值时返回true
isNaN
相当于
函数isNaN(x){x=+x;return x!==x;}
。抱歉,Samuel,你没有掌握它的一半,你对isNaN的函数应该是:函数isNaN(x){return x!=x},而不是一个字节;user1170379的建议是我们大多数人希望它得到实施的方式。为了进一步证明,
x={}
isNaN(x)=>true
但是
x=x=>false
所以,为了回答OP的问题,是的,
isNaN
检查是多余的。@Jamie绝对不是多余的。如果是的话,它就不会在那里了。假设你想检查无穷大。这是一个有效的数字(在某些情况下,比如在数学应用程序中,你会将无穷大合并到你的逻辑中)。那里,
!isNaN()
将返回true,但isFinite将返回false。是的,您所说的一切都是正确的<代码>!isNaN(无穷大)==true
,而
isFinite(无穷大)==false
。所以,
isFinite(num)&!isNaN(num)==false
。这就是为什么
isNaN
检查是冗余的-
isFinite
捕获了
NaN
Infinity
失败案例。天哪,我一直认为
1/0
将计算为
NaN
,但我刚刚检查了它,它返回