来自MDN
//这是一个误报,其原因并不完全是NaN 可靠
isNaN( '布拉布拉'); // true:“blabla”转换为数字。
上述false positive
如何? blabla
确实不是数字,因此它应该是true positive
。其中上述内容不是isNaN is not entirely reliable
。
我已经查找blabla
是某个数字系统中的数字,但没有遇到任何数字。
答案 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
参数
NaN
。相反,它首先隐式地将任何非数字值强制转换为数字,然后测试结果。这就是我们isNaN({})
为true
但isNaN([])
为false
的结果。
当然,如果您认为isNaN(x)
为“ x
,当转换为数字时,会产生NaN
?”,那么这是不是误报。但这并不是大多数人所期望的。