在JavaScript中如何检测NaN?

11 浏览
0 Comments

在JavaScript中如何检测NaN?

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

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

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

傻瓜,不,那太容易了。NaN就像SQL中的NULL,它与任何东西都不相等,甚至不等于它自己。

但是看,有一个叫做isNaN()的函数,也许那个能行!

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

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

我该怎么做呢?

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

0
0 Comments

在JavaScript中,如何测试NaN是一个常见的问题。NaN是JavaScript中的特殊值,它不等于任何其他值,甚至不等于它自身。因此,要测试一个值是否为NaN,可以使用以下代码:

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

然而,在阅读MDN文档后,建议还应检查`typeof x === "number"`。因为isNaN在比较之前会将值强制转换为数字。这就导致了一些奇怪的情况,例如`+[] == 0`(空数组转换为数字为0)。

值得注意的是,这种NaN的行为在其他语言中也是相同的。Java、C#、Python、Scala和C++(在clang、g++和msvc下)都有相同的NaN行为。在所有这些语言中,`0/0`的结果都是NaN,并且NaN不等于它自身。这是IEEE 754标准的要求。

虽然使用标准的理由是最佳实践和用户的预期,但在这种情况下这些理由并不适用。这个问题更多的是一个CPU架构的问题,而不是JavaScript特有的问题。

需要注意的是,如果x的值是字符串"2",上述代码将会失败,因为`x !== x`的结果会是false。

0
0 Comments

NaN的全称是Not a Number,它是JavaScript中一个特殊的值,用于表示非数值的情况。在JavaScript中,我们经常需要判断一个值是否为NaN。那么如何在JavaScript中测试NaN呢?

上面的代码给出了一种测试NaN的方法。首先,将要测试的值转换为数字类型,然后判断转换后的值是否不等于转换前的值。如果不相等,那么就可以判断该值是NaN。

这种方法看起来可能有些复杂,但却非常有效。它利用了JavaScript中的一个特性,即NaN与任何值都不相等,包括它自身。因此,只要将一个值转换为数字类型后与自身比较,如果不相等,就可以确定该值是NaN。

需要注意的是,这种方法只适用于将要测试的值是字符串或其他可以转换为数字的类型的情况。如果要测试的值是一个对象或其他特殊类型的情况,可能需要使用其他方法。

总结起来,测试NaN的方法如下:

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

希望这个方法能对你有所帮助!

0
0 Comments

JavaScript中如何测试NaN?

短答案:

对于使用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进行测试,它在所有地方都可以工作,并且不依赖于最新的JavaScript。(它总是给我正确的结果,没有任何意外!)

详细解释:

这是我们神奇的NaN:

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

请不要责怪JavaScript,这是NaN在其他语言中也应该以这种方式运行的,这是根据所有比较返回false的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("") = false和isNaN({}) = true,而Number.isNaN("") = false和Number.isNaN({}) = false。

Polyfill也可以简单地写为Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });基本上是相同的,只是字符减少了一些,并且将变量设置移动到运算符的另一侧。

在这里阅读更多关于isNaN()的信息:w3schools.com/jsref/jsref_isnan.asp

0