简短回答
对于 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 中保持一致,您还可以使用此Number.isNan 的 polyfill
#3
Number.isNaN = Number.isNaN || function(value) {
return typeof value === "number" && isNaN(value);
}
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
注意:我更喜欢使用#1进行测试,它在所有地方都可以正常工作,并且不依赖于最新的JS。(它总是为我提供正确的结果。没有意外!)
详细说明:
这是我们很棒的 NaN
NaN == NaN
NaN === NaN
请不要因此责怪JavaScript
,在其他语言中,NaN也应该以这种方式运行,这是可以接受的,正如所有比较返回false NaN值的原理所述。
因此,我们的救星isNaN
出现了,但等等,在某些情况下它的行为有点不同。
isNaN(undefined)
isNaN({})
isNaN("lorem ipsum")
看到上面的结果我感到有些奇怪。接下来是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)
ES6的实现对于上述情况也会有所帮助。
Number.isNaN(undefined)
Number.isNaN({})
Number.isNaN("lorem ipsum")
而 ECMAScript-5 全局函数 isNaN
输出的结果为 true
,与我们的预期有时可能不一致。
isNaN
? - Bergi["2015", "05", "05"]
被标记为NaN时,我几乎要打屏幕了。 - Michael Lorton