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

parseFloat('geoff') == NaN;

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

当前回答

Number('hello').toString() === 'NaN' // true
Number(undefined).toString() === 'NaN' // true
    
Number('12345').toString() === 'NaN' // false  

// These all evaluate to 0 which is a number
Number('').toString() === 'NaN' // false // 0
Number('0').toString() === 'NaN' // false // 0
Number().toString() === 'NaN' // false // 0

// These all evaluate to 0 and 1 which is a number
Number(false).toString() === 'NaN' // false // 0
Number(true).toString() === 'NaN' // false // 1

其他回答

NaN在JavaScript中代表“不是一个数字”,尽管它的类型实际上是数字。

typeof(NaN) // "number"

要检查一个变量的值是否为NaN,我们不能简单地使用函数isNaN(),因为isNaN()有以下问题:

var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN

这里真正发生的是myVar被隐式地强制为一个数字:

var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact

这是有道理的,因为A实际上不是一个数字。但我们真正想检查的是myVar的值是否为NaN。

因此isNaN()无法提供帮助。那我们该怎么办呢?

鉴于NaN是唯一被视为与自身不相等的JavaScript值,因此我们可以使用!==来检查它是否与自身相等

var myVar; // undefined
myVar !== myVar // false

var myVar = "A";
myVar !== myVar // false

var myVar = NaN
myVar !== myVar // true

所以总结一下,如果一个变量!==本身是正确的,那么这个变量的值正好是NaN:

function isOfValueNaN(v) {
    return v !== v;
}

var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false

从ES6开始,Object.is(..)是一个新的实用程序,可以用来测试两个值是否绝对相等:

var a = 3 / 'bar';
Object.is(a, NaN); // true

找到了另一种方法,只是为了好玩。

function IsActuallyNaN(obj) {
  return [obj].includes(NaN);  
}

函数isNotANumber(n) { If (typeof n !== 'number') { 返回true; } == n; }

我使用下划线的isNaN函数,因为在JavaScript中:

isNaN(undefined) 
-> true

至少,要意识到这一点。