如何在JavaScript中测试NaN?

如何在JavaScript中测试NaN?,javascript,nan,Javascript,Nan,我有一个变量x,我想测试x是否设置为NaN。我该怎么做 我的第一反应可能是,你知道,测试它,像这样: if (x === NaN) { ... 傻兔子,不,那太容易了。NaN就像SQL中的NULL,它不等于任何东西,甚至它本身 但是,你看,有一个函数叫做isNaN()——也许这样就可以了 不,据我所知,isNaN()完全一文不值 例如,isNaN([“”])正确地返回false,但isNaN([“”])返回true。你不想知道我是怎么知道这个缺陷的 我该怎么做 事实证明,我的问题是重复的,但

我有一个变量x,我想测试x是否设置为NaN。我该怎么做

我的第一反应可能是,你知道,测试它,像这样:

if (x === NaN) {  ...
傻兔子,不,那太容易了。NaN就像SQL中的NULL,它不等于任何东西,甚至它本身

但是,你看,有一个函数叫做
isNaN()
——也许这样就可以了

不,据我所知,
isNaN()
完全一文不值

例如,
isNaN([“”])
正确地返回false,但
isNaN([“”])
返回true。你不想知道我是怎么知道这个缺陷的

我该怎么做


事实证明,我的问题是重复的,但选择的答案是错误的。这个问题有20%的得票率。

如果你仔细阅读,这个问题就有答案了。这就是我找到它的方式:我把问题打出来,然后。。。宾果

还记得我写过“
NaN
在SQL中类似于NULL,它不等于任何东西,甚至它本身”?据我所知,
NaN
是Javascript中唯一具有此属性的值。因此,你可以写:

var reallyIsNaN = function(x) {
   return x !== x;
};

简短回答

对于ECMAScript-5用户:

#1
if(x !== x) {
    console.info('x is NaN.');
}
else {
    console.info('x is NOT a NaN.');
}
对于使用ECMAScript-6的用户:

#2
Number.isNaN(x);
为了实现ECMAScript 5和6之间的一致性,您也可以使用

注意:我更喜欢使用#1进行测试,它在所有地方都能正常工作,并且不依赖最新的JS。(它总是给我正确的结果。没有意外!)


详细说明:

这是我们最棒的NaN

NaN == NaN; // false
NaN === NaN; // false
请不要为此责备
JavaScript
,应该是NaN在其他语言中也有这种行为,根据

因此,
isNaN
成为了我们的救世主,但等等,在某些情况下,它的行为几乎没有什么不同,比如

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true
看到上面的结果,我有一些奇怪的面孔。这是来自MDN的原因

当isNaN函数的参数不是Number类型时,该值首先强制为一个数字。然后测试结果值以确定其是否为NaN

那么我们应该如何测试非数字变量的NaN呢?我总是遵循以下原则

if(x !== x) {
    console.info('Is a NaN');
}
else {
    console.info('Not a NaN');
}
ECMAScript-6/JavaScript-2015更新

我们在ECMAScript-6中有同样的东西吗。是的,我们有

Number.isNaN(x); // true
ES6的实施也将有助于上述情况,如

Number.isNaN(undefined); // false
Number.isNaN({}); // false    
Number.isNaN("lorem ipsum"); // false

而ECMAScript-5全局函数
isNaN
在上述情况下输出为
true
,有时可能与我们的预期不符。

阅读后,建议还检查
typeof x==“number”
isNaN
的不同之处在于,它在比较(
+[]==0
,wat?)之前将值强制为一个数字,当您说+[]==0时,javascript尝试将数组的第一个值转换为整数。尝试在空数组中调用数组[0],它将返回undefined。此转换不等于parseInt的转换,未定义的将转换为0,请尝试+[1]和+['1223fsds']。最后0==0。这就是你得到这个结果的原因。@thgaskell是的,我看了视频。真是好笑。检查这个帖子@ Tasgkel-WAT不是。请保持冷静,记住java、C++、python、斯卡拉、C++(Culn、g++和MSVC)都具有与JavaScript相同的NAN行为。在所有这些语言中,
0/0
都是NaN,而在所有这些语言中,NaN并不等于它本身。这只是“你不想知道我是怎么知道这个漏洞的。”-我想知道你为什么要在数组上调用
isNaN
?@Bergi——我在写一个日期选择器。当
[“2015”、“05”、“05”]
被标记为NaN时,我几乎要打到屏幕上。但你为什么期望数组的行为像一个数字呢?@Bergi——我不是。Angular给我的意思是“数据还不可用”,实际数据(在本例中是一个数组)可用时。我需要一种方法来知道数据是否在那里。@Bergi——如果你看,你可以看到问题:Angular调用ngModel。$render with NaN(如果数据未准备好),如果数据已准备好,则使用数据。在一种情况下,数据是一个数组,但还有很多其他情况。当然,没有理由说NaN本身不能成为一个合法的值……比如,
isNaN(“”=false
isNaN({})=true
Number.isNaN(“”=false
Number.isNaN({})=false
Polyfill也可以像
Number['isNaN'].\124;(Number.isNaN=function(a){return a!==a})一样简单基本相同,减去一些字符,变量集移到运算符的另一侧。请阅读有关isNaN()的更多信息:
Number.isNaN(undefined); // false
Number.isNaN({}); // false    
Number.isNaN("lorem ipsum"); // false