我有一个变量x,我想测试x是否设置为NaN。我该怎么做?
我的第一直觉可能就是测试它,就像这样:
if (x === NaN) { ...
傻兔子,不,那太容易了。在SQL中,NaN就像NULL,它不等于任何东西,甚至本身。
但是看,有一个名为isNaN()
的函数 - 也许会这样做!
不,据我所知,isNaN()
完全没用。
例如,isNaN([""])
正确返回false,但isNaN(["."])
返回true。你不想知道我是如何了解这个缺陷的。
我该怎么做?
事实证明,我的问题与this one重复,但所选答案是错误的。 right answer有大约20%的赞成票。
答案 0 :(得分:40)
简答
对于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,你也可以使用这个polyfill for 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;
}
注意:我更喜欢使用#1进行测试,它在所有地方都一样,并且也不依赖于最新的JS。 (它总是给我正确的结果。没有惊喜!)
详细说明:
这是我们真棒的NaN
NaN == NaN; // false
NaN === NaN; // false
请不要责怪JavaScript
这个,它应该在其他语言中以这种方式运行的NaN也是如此rationale for all comparisons returning false NaN values
所以isNaN
作为我们的救世主来了,但在某些情况下等待它的行为却没有什么不同,比如
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
通过查看上面的结果,我有一些奇怪的面孔。这是来自MDN的原因
当isNaN函数的参数不是Number类型时,该值首先被强制转换为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
中针对上述情况输出,有时可能与我们的预期不一致。
答案 1 :(得分:22)
如果你仔细阅读,问题就有了答案。这就是我找到它的方式:我正在输入问题并且......宾果。
你记得当我写“NaN
在SQL中就像NULL一样,它不等于任何东西,甚至本身”?据我所知,NaN
是Javascript中唯一具有此属性的值。因此你可以写:
var reallyIsNaN = function(x) {
return x !== x;
};