如何检查JavaScript中的数字是否为NaN?

I’ve only been trying it in Firefox’s JavaScript console, but neither of the following statements return true:

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;
番长猴子2020/03/30 17:07:28

根据IEEE 754,除!=之外,所有涉及NaN的关系都评估为false。因此,例如,如果A或B或两者均为NaN,则(A> = B)=假,(A <= B)=假。

猪猪2020/03/30 17:07:28

似乎开箱即用的Node.js不支持isNaN()。
我与

var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
米亚2020/03/30 17:07:28
NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

相等运算符(==和===)不能用于针对NaN测试值。

查看Mozilla文档。全局NaN属性是一个表示Not-A-Numbe的值

最好的方法是使用内置函数“ isNaN()”来检查NaN。所有浏览器都支持该方式。

达蒙2020/03/30 17:07:28

我使用下划线isNaN功能,因为在JavaScript中:

isNaN(undefined) 
-> true

至少要注意该陷阱。

古一2020/03/30 17:07:27

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

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
梅小卤蛋2020/03/30 17:07:27

我刚刚在有效JavaScript一书中遇到了这种技术,它很简单:

由于NaN是唯一被视为与自己不相等的JavaScript值,因此您始终可以通过检查其与自己的相等性来测试该值是否为NaN:

var a = NaN;
a !== a; // true 

var b = "foo";
b !== b; // false 

var c = undefined; 
c !== c; // false

var d = {};
d !== d; // false

var e = { valueOf: "foo" }; 
e !== e; // false

直到@allsyed发表评论才意识到这一点,但这在ECMA规范中:https ://tc39.github.io/ecma262/#sec-isnan-number

十三2020/03/30 17:07:27

试试这个代码:

isNaN(parseFloat("geoff"))

要检查是否数值而不是数字而不是数字NaN,请参见此处:如何在Javascript中测试NaN?