如何在 JavaScript 中测试 NaN?

问题描述 投票:0回答:4

我有一个变量 x,我想测试 x 是否设置为 NaN。 我该怎么做?

我的第一直觉可能是,你知道,测试它,就像这样:

if (x === NaN) {  ...

傻兔子,不,那太容易了。 NaN 就像 SQL 中的 NULL,它不等于任何东西,甚至不等于它本身。

但是看,有一个名为

isNaN()
的函数——也许可以做到这一点!

不,据我所知,

isNaN()
完全没有价值。

例如,

isNaN([""])
正确返回 false,但
isNaN(["."])
返回 true。 你不想知道我是如何得知这个缺陷的。

我该怎么做?

事实证明,我的问题与这个问题重复,但所选答案是错误的。 正确答案有 20% 的赞成票。

javascript nan
4个回答
76
投票

简短回答

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

注意:我更喜欢使用 #1 进行测试,它在所有地方都相同,并且也不依赖于最新的 JS。 (它总是给我正确的结果。没有惊喜!)


详细说明:

这是我们很棒的 NaN

NaN == NaN; // false
NaN === NaN; // false

请不要为此责备

JavaScript
,NaN 在其他语言中也应该以这种方式表现,根据返回错误 NaN 值的所有比较的基本原理,这很好

因此,

isNaN
成为我们的救世主,但等等,它在某些情况下的表现略有不同,例如

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true

看到上面的结果,我有些奇怪的表情。这是来自 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); // true

ES6 的实现对于上述情况也会有所帮助,例如

Number.isNaN(undefined); // false
Number.isNaN({}); // false    
Number.isNaN("lorem ipsum"); // false

而 ECMAScript-5 全局函数

isNaN
在上述情况下以
true
输出,有时可能与我们的预期不一致。


27
投票

如果你仔细阅读,这个问题就有答案了。 这就是我找到它的方式:我正在输入问题然后......宾果游戏。

你还记得我写的“

NaN
就像SQL中的NULL,它不等于任何东西,甚至它本身”? 据我所知,
NaN
是 Javascript 中唯一具有此属性的值。 因此你可以写:

var reallyIsNaN = function(x) {
   return x !== x;
};

0
投票

看起来有点矫枉过正,但是尝试一下怎么样?:

if (Number(dataInput) !== Number(dataInput))
{
    ...
}

0
投票

NaN 是数学运算结果的可能值之一:

  • Number("test")
    给出 NaN
  • 5/0
    给出无穷大,这也会导致问题

我寻找更强大的解决方案,发现

Number.isFinite
这比仅仅检查 NaN 更好。

多年来所有浏览器都支持

Number.isFinite
函数,该函数可用于检查
NaN
Infinity
等所有情况,因为仅当给定数字有限时它才返回
true

// Expected output for below code: true
console.log(Number.isFinite(10 / 5));
console.log(Number.isFinite(123.1238324920384203))


// Expected output for below code: false
console.log(Number.isFinite(1 / 0));
console.log(Number.isFinite(0 / 0));
console.log(Number.isFinite(true))
console.log(Number.isFinite("true"))
console.log(Number.isFinite("123"))

此外,它不会进行任何强制,并且我们始终保证值是有效的数字。

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite

© www.soinside.com 2019 - 2024. All rights reserved.