怎么是'isNaN('blabla');` - >真的,假阳性?

时间:2018-05-25 18:38:04

标签: javascript nan

来自MDN

  

//这是一个误报,其原因并不完全是NaN   可靠

     

isNaN( '布拉布拉'); // true:“blabla”转换为数字。

上述false positive如何? blabla确实不是数字,因此它应该是true positive。其中上述内容不是isNaN is not entirely reliable

的一个很好的例子

我已经查找blabla是某个数字系统中的数字,但没有遇到任何数字。

3 个答案:

答案 0 :(得分:3)

  

上述假阳性如何?不是blabla确实不是一个数字   因此它应该是一个真正的积极。

因为传递给SQL Server 2012的参数是隐式转换为isNaN() 类型 (无论是否可以是实际数字)。我怀疑这是因为某些字符串可以具有等效的数字

但是, Number.isNaN() 方法是一项更具体的测试,并返回正确的结果,因为不会进行转换 - 传递的值不能是number 其未强制类型必须为NaN才能返回Number

您可以将这两个版本视为与false==类似。

===

答案 1 :(得分:2)

NaN指定的IEEE 754是特定浮点运算的结果。这是清单

 inf  -  inf = NaN
-inf  +  inf = NaN
   0  /  0   = NaN
  -0  /  0   = NaN
   0  / -0   = NaN
  -0  / -0   = NaN
 inf  /  inf = NaN
-inf  /  inf = NaN
 inf  / -inf = NaN
-inf  / -inf = NaN
 inf  *  0   = NaN
 inf  * -0   = NaN

因此,通过NaN(根据isNaN)检查值IEEE 754是否与询问该值是否是上述任何操作的结果相同。

blabla不是上述任何操作的结果,因此不应将其视为NaN,但确实如此。 (因此它被认为是假阳性)

答案 2 :(得分:1)

  

blabla确实不是数字

NaN是一个数字(尽管它的名字是“非数字”的缩写)。 isNaN()会检查您传递的号码是否为NaN

"blabla"不是NaN。它不可能,因为"blabla"根本不是数字。这就是isNaN("blabla")返回true被视为误报的原因。

如果我们按名称命名,isNaN只应返回true参数

  1. 是一个数字,
  2. 具有特殊值NaN
  3. 相反,它首先隐式地将任何非数字值强制转换为数字,然后测试结果。这就是我们isNaN({})trueisNaN([])false的结果。

    当然,如果您认为isNaN(x)为“ x,当转换为数字时,会产生NaN”,那么这是不是误报。但这并不是大多数人所期望的。