我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;

当前回答

我创建了这个小函数,它就像一个咒语。 而不是检查NaN,这似乎是违反直觉的,你检查一个数字。我很确定我不是第一个这样做的人,但我想分享一下。

function isNum(val){
    var absVal = Math.abs(val);
    var retval = false;
    if((absVal-absVal) == 0){
        retval = true
    }

    return retval;
}

其他回答

规则是:

NaN != NaN

isNaN()函数的问题是,在某些情况下,它可能会返回意想不到的结果:

isNaN('Hello')      //true
isNaN('2005/12/12') //true
isNaN(undefined)    //true
isNaN('NaN')        //true
isNaN(NaN)          //true
isNaN(0 / 0)        //true

检查该值是否真的为NaN的更好方法是:

function is_nan(value) {
    return value != value
}

is_nan(parseFloat("geoff"))

你应该使用全局isNaN(value)函数调用,因为:

支持跨浏览器 有关文档,请参阅isNaN

例子:

 isNaN('geoff'); // true
 isNaN('3'); // false

我希望这对你有所帮助。

我只想分享另一种选择,它不一定比这里的其他选择更好,但我认为它值得一看:

function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }

这背后的逻辑是,除了0和NaN之外的所有数字都被转换为true。

我做了一个快速测试,它的性能和Number一样好。isNaN和as检查自身是否为false。这三个都比isNan表现得好

结果

customIsNaN(NaN);            // true
customIsNaN(0/0);            // true
customIsNaN(+new Date('?')); // true

customIsNaN(0);          // false
customIsNaN(false);      // false
customIsNaN(null);       // false
customIsNaN(undefined);  // false
customIsNaN({});         // false
customIsNaN('');         // false

如果您想避免损坏的isNaN函数,可能会很有用。

简单地将结果转换为String并与'NaN'进行比较。

var val = Number("test");
if(String(val) === 'NaN') {
   console.log("true");
}

MDN的parseFloat页面中提到了另一个解决方案

它提供了一个过滤器函数来执行严格的解析

var filterFloat = function (value) {
    if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
      .test(value))
      return Number(value);
  return NaN;
}


console.log(filterFloat('421'));               // 421
console.log(filterFloat('-421'));              // -421
console.log(filterFloat('+421'));              // 421
console.log(filterFloat('Infinity'));          // Infinity
console.log(filterFloat('1.61803398875'));     // 1.61803398875
console.log(filterFloat('421e+0'));            // NaN
console.log(filterFloat('421hop'));            // NaN
console.log(filterFloat('hop1.61803398875'));  // NaN

然后你可以用isNaN来检查它是否是NaN