为什么在JS中isNaN(null) == false?

2022-08-30 02:58:28

JS中的这段代码给了我一个弹出窗口,上面写着“我认为null是一个数字”,我觉得这有点令人不安。我错过了什么?

if (isNaN(null)) {
  alert("null is not a number");
} else {
  alert("i think null is a number");
}

我正在使用Firefox 3。这是浏览器错误吗?

其他测试:

console.log(null == NaN);   // false
console.log(isNaN("text")); // true
console.log(NaN == "text"); // false

那么,问题似乎不是与NaN的精确比较吗?

编辑:现在问题已经得到解答,我已经清理了我的帖子,以便为存档提供更好的版本。但是,这使得一些评论甚至一些答案有点难以理解。不要责怪他们的作者。我改变的事情包括:

  • 删除了一条注释,说我首先通过恢复其含义来搞砸了标题
  • 前面的答案表明,我没有足够清楚地说明为什么我认为这种行为很奇怪,所以我添加了检查字符串并进行手动比较的示例。

答案 1

我相信代码试图问,“是数字吗?”这里的具体情况是。该函数可用于回答此问题,但从语义上讲,它特指值。来自NaN的维基百科:xx = nullisNaN()NaN

NaN(Not a Number)是表示未定义或不可表示值的数值数据类型的值,尤其是在浮点计算中。

在大多数情况下,我们认为“是空数字?”的答案应该是否定的。但是,在语义上是正确的,因为 不是 。isNaN(null) == falsenullNaN

以下是算法解释:

该函数尝试将传递的参数转换为数字1(等效于 ),然后测试该值是否为 。如果参数无法转换为数字,将返回 2。因此,如果将参数转换为数字导致 ,则返回 true;否则,它将返回 false。isNaN(x)Number(x)NaNNumber(x)NaNxNaN

因此,在特定情况下,将转换为数字 0(尝试计算并看到它返回 0,)并返回 false。只有数字的字符串可以转换为数字,isNaN 也返回 false。无法转换为数字的字符串(例如 )将导致返回 true,特别是因为返回 .x = nullnullNumber(null)isNaN(0)'abcd'isNaN('abcd')Number('abcd')NaN

除了这些明显的边缘情况之外,还有返回NaN的标准数值原因,如0/0。

至于问题中所示的看似不一致的相等性检验,指定的行为使得任何比较都是错误的,而不管其他操作数如何,包括其本身1NaNx == NaNNaN


答案 2

我自己也遇到了这个问题。

对我来说,最好的使用方式是NaN就是这样

isNaN(parseInt(myInt))

以上面phyzome的例子为例,

var x = [undefined, NaN,     'blah', 0/0,  null, 0,     '0',   1,     1/0, -1/0,  Number(5)]
x.map( function(n){ return isNaN(parseInt(n))})
        [true,      true,    true,   true, true, false, false, false, true, true, false]

(我根据输入对齐了结果,希望它能使它更容易阅读。

这对我来说似乎更好。