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

IT技术 javascript nan
2021-01-27 14:38:15

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

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;
6个回答

试试这个代码:

isNaN(parseFloat("geoff"))

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

isNaN(parseFloat("geoff")) // true isNaN(parseFloat("10geo")) // false 这有什么用?
2021-03-13 14:38:15
这对于尝试w3schools.com/jsref/jsref_isnan.asp也很有用
2021-03-15 14:38:15
是否需要paseFloat?
2021-03-17 14:38:15
如果您希望将空字符串解释为NaN,则可以。(我不是说你总是会。)
2021-03-20 14:38:15
如果我是你,我会将它分配给一个变量,并使用条件变量 !== 变量。正如规范tc39.github.io/ecma262/#sec-isnan-number 中所述
2021-03-21 14:38:15

我刚刚在Effective 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

这不是违反直觉的代码,而是 NaN。
2021-03-16 14:38:15
@Tarmil 正式注意到!这真的很有趣;我一直认为 NaN 不等式的怪异是 Javascript 的事情。
2021-03-17 14:38:15
@DanM 这不是错误,而是 NaN 的标准 IEE754 行为。这就是它在 CPU 中的实现方式,也是世界上使用浮点数的每种编程语言的预期行为。
2021-03-28 14:38:15
@atilkan - 这不是错误,而是一项功能。NaN不是值,而是出现问题的信号。此外,这表明数学运算(包括===)不会产生合理的结果。+"foo" === +undefined不应该评估为true,并且+"foo" === +"bar"可以说会更糟。
2021-03-28 14:38:15
有效但违反直觉。我不想维护这种代码。
2021-04-08 14:38:15

使用此代码:

isNaN('geoff');

请参阅isNaN()MDN 上的文档

alert ( isNaN('abcd'));  // alerts true
alert ( isNaN('2.0'));  // alerts false
alert ( isNaN(2.0));  // alerts false
也许这只是我,但楠想法被混淆的时候var value = 0/0;,并var value2= String("123 131");创建NaN值和这样的事情var value3 = "abcd";也是NaN值。
2021-03-23 14:38:15
@NickPineda 为什么?
2021-03-26 14:38:15

至于要测试Number类型的值是否为 a NaN,全局函数isNaN将完成这项工作

isNaN(any-Number);

对于适用于 JS 中所有类型的通用方法,我们可以使用以下任何一种方法:

对于 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 用于 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;
}

请查看此答案以获取更多详细信息。

@NickPineda 感觉是如此相互,但最后 MDN 可以这样解释“当 isNaN 函数的参数不是 Number 类型时,首先将该值强制为一个 Number。然后测试结果值以确定它是否为南。”
2021-03-15 14:38:15
感谢您不仅使用“isNan()”,而且提供了一个完整详细的答案。当我在谷歌上发现这个问题时,这正是我正在寻找的。
2021-03-17 14:38:15
isNaN("lorem ipsum"); //真正的ES5让我大吃一惊
2021-03-18 14:38:15
“.... 在上述情况下给出了错误的结果”我不会说错,只是不同,因为全局首先isNaN将参数转换为数值。
2021-03-28 14:38:15
@FelixKling 请检查更新的答案。谢谢。
2021-03-30 14:38:15

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

var a = 3 / 'bar';
Object.is(a, NaN); // true
2021-04-08 14:38:15