你如何在 JavaScript 中测试 NaN?

IT技术 javascript nan
2021-01-17 02:55:14

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

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

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

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

但是看,有一个函数被调用isNaN()——也许可以做到!

不,据我所知,isNaN()完全没有value。

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

我该怎么做呢?

原来,我的问题是这个问题的重复,但选择的答案是错误的。正确的答案有20%之多upvotes。

2个回答

简答

对于 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上述情况下,有时可能与我们的预期不一致。

isNaN( "" ) = falseisNaN( {} ) = trueNumber.isNaN( "" ) = falseNumber.isNaN( {} ) = false
2021-03-17 02:55:14
Polyfill 也可以像“Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });基本相同”一样简单,减去少量字符,并将变量集移动到运算符的另一侧。
2021-03-25 02:55:14
在此处阅读有关 isNaN() 的更多信息:w3schools.com/jsref/jsref_isnan.asp
2021-03-31 02:55:14

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

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

var reallyIsNaN = function(x) {
   return x !== x;
};
@thgaskell - wat 不是wat
2021-03-20 02:55:14
请保持冷静并记住 Java、C#、Python、Scala、C++(在 clang、g++ 和 msvc 下)都具有与 JavaScript 相同的 NaN 行为。在所有这些语言中0/0都是 NaN 并且在所有这些语言中 NaN 都不等于它自己。这正是标准所要求的
2021-04-01 02:55:14
@thgaskell 当您说 +[] == 0 时,javascript 会尝试将数组的第一个值转换为整数。尝试调用 array[0] un 一个空数组,它将返回 undefined。这个转换不等于 parseInt 和 undefined 将被转换为 0,尝试 +[1] 和 + ['1223fsds']。最后 0 == 0。这就是你得到那个结果的原因。
2021-04-04 02:55:14
在阅读了 Number.NaN 的 MDN 文档,它建议还检查是否typeof x === "number". isNaN不同之处在于它在比较 ( +[] == 0, wat?)之前将值强制转换为数字
2021-04-09 02:55:14
@thgaskell 是的,我看过视频。这很有趣。检查这篇文章stackoverflow.com/questions/30325896/...
2021-04-13 02:55:14