你如何在JavaScript中测试NaN?

Mal*_*lio 39 javascript nan

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

我的第一直觉可能就是测试它,就像这样:

if (x === NaN) {  ...
Run Code Online (Sandbox Code Playgroud)

傻兔子,不,这太容易了.NaN在SQL中就像NULL,它不等于任何东西,甚至本身.

但是看,有一个叫做的函数isNaN()- 也许会这样做!

不,据我所知,isNaN()完全没有价值.

例如,isNaN([""])正确返回false,但isNaN(["."])返回true.你不想知道我是如何了解这个缺陷的.

我该怎么做呢?

事实证明,我的问题与问题重复,但所选答案是错误的.将正确的答案有20%之多upvotes.

dop*_*ude 45

简答

对于ECMAScript-5用户:

#1
if(x !== x) {
    console.info('x is NaN.');
}
else {
    console.info('x is NOT a NaN.');
}
Run Code Online (Sandbox Code Playgroud)

对于使用ECMAScript-6的人:

#2
Number.isNaN(x);
Run Code Online (Sandbox Code Playgroud)

为了保持ECMAScript 5和6的一致性,您也可以将此polyfill用于Number.isNan

#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}
Run Code Online (Sandbox Code Playgroud)

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


详细说明:

这是我们真棒的NaN

NaN == NaN; // false
NaN === NaN; // false
Run Code Online (Sandbox Code Playgroud)

请不要因此而责备JavaScript,NaN应该在其他语言中以这种方式运行.根据返回虚假NaN值的所有比较,这是合理的

因此,isNaN作为我们的救世主,但在某些情况下等待它的行为却没有什么不同

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true
Run Code Online (Sandbox Code Playgroud)

看到上面的结果,我有一些奇怪的面孔.这是MDN的原因

当isNaN函数的参数不是Number类型时,该值首先被强制转换为Number.然后测试得到的值以确定它是否是NaN.

那么我们应该如何测试NaN的非数字变量呢?我总是通过以下方式

if(x !== x) {
    console.info('Is a NaN');
}
else {
    console.info('Not a NaN');
}
Run Code Online (Sandbox Code Playgroud)

ECMAScript-6/JavaScript-2015更新

我们在ECMAScript-6中有什么相同的东西.是的,我们做...

Number.isNaN(x); // true
Run Code Online (Sandbox Code Playgroud)

ES6实现也将有助于上述情况,如

Number.isNaN(undefined); // false
Number.isNaN({}); // false    
Number.isNaN("lorem ipsum"); // false
Run Code Online (Sandbox Code Playgroud)

而ECMAScript-5全局函数isNaN输出true用于上述情况,有时可能不符合我们的预期.

  • 比如`isNaN("")= false`和`isNaN({})= true`而``Number.isNaN("")= false`和`Number.isNaN({})= false` (2认同)

Mal*_*lio 22

如果你仔细阅读,问题就有了答案.这就是我找到它的方式:我正在输入问题和...宾果游戏.

你记得当我写" NaN在SQL中像NULL一样,它不等于任何东西,甚至本身"?据我所知,这NaN是Javascript中唯一具有此属性的值.因此你可以写:

var reallyIsNaN = function(x) {
   return x !== x;
};
Run Code Online (Sandbox Code Playgroud)