52
parseFloat("NaN")

返回“NaN”,但

parseFloat("NaN") == "NaN"

返回假。现在,它返回 false 可能是件好事,但我不明白这是怎么回事。JavaScript 的创建者是否只是将其作为一个特例?因为否则我无法理解这如何返回错误。

4

8 回答 8

39

更新 2

ECMAScript 6 的新功能是Object.is()函数。这旨在进一步增强===检查。这个新函数的好处之一是它Object.is(NaN, NaN)现在将返回 true。如果您能够使用 ECMAScript 6,那么这对您来说将是最具可读性和一致性的解决方案。

原来的

检查这一点的正确方法是:

isNaN(parseInt(variable))

如果您检查的是 NaN,则该函数将返回 true。此方法内置于 JavaScript 规范中。

使用 jQuery

jQuery 内置了自己的isNaN函数,最初是为了帮助解决浏览器之间的一些差异,并添加一些额外的检查,以便可以使用它们的版本而不是 VanillaJS 中的版本。

jQuery 更新

在 jQuery 1.7 之后,他们将此函数更改为$.isNumeric().

开关文件

如果你看一下这个 Stack Overflow question,你会发现很多时候isNaN()返回直观上被认为是“不正确”的答案,但在规范中是正确的。

避免使用香草的一大原因isNaN()是它null会返回false,让你认为它是一个数字。但是,jQuery 函数涵盖了更大范围的直观结果。

从他们的文档中:

从 jQuery 3.0 开始,$.isNumeric() 只有当参数是数字类型,或者它是字符串类型并且可以强制转换为有限数字时才返回 true。在所有其他情况下,它返回 false。

于 2012-09-27T19:05:08.617 回答
38

当一个 JavaScript 函数返回 时NaN,这不是一个文字字符串,而是全局空间中的一个对象属性。您无法将其与 string 进行比较"NaN"

请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

于 2011-08-08T00:17:13.823 回答
37

这是一个特例,NaN 是 Javascript 中唯一不等于自身的东西。

尽管关于字符串与 NaN 对象的其他答案也是正确的。

于 2011-08-08T00:17:14.747 回答
12

NaN是不等于自身的对象的少数示例之一。事实上,这个属性就是用来实现通用bool IsNaN(number)方法的:

function isNaN(x)
{ 
    return x != x; 
}
于 2014-05-22T21:29:25.493 回答
9

isNaN适用于所有不是数字的值

isNaN('foo') == true // a string is indeed not a number
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true // an array is also not a number

但是,如果您想NaN特别检查或避免类型强制;
你可以Number.isNaN改用

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
于 2015-10-01T09:42:07.477 回答
8
  • Number(由 ParseFloat 返回)比较string string转换为Number
  • NaN不等于任何其他对象(包括NaN

你得到NaN==NaN. 第二条规则是错误的。

于 2011-08-08T00:23:53.287 回答
1

在 ECMAScript 6 中,Object.is() 是 === 的增强。此方法接受两个参数,如果值相等则返回 true。当两个值的类型相同且值相同时,则认为这两个值相等。这就是原因,因为 console.log(Object.is(NaN, NaN))--> TRUE

于 2017-04-05T15:55:38.293 回答
0

我正在使用 Google Apps Script,所以我坚持使用 ECMA 5。与 Electric Coffee 的答案类似,这就是我能够弄清楚的,这似乎可以确定一个值是否实际上是NaN,而不是如果一个值是NaN但如果它实际上是NaN它自己:

function isThisNaN(x)
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
}
console.log(isThisNaN(NaN)); // true

大声笑对我来说很有趣,这Object.prototype.toString.call(NaN)等于'[object Number]'。我的新手大脑告诉我这NaN不是一个数字,但遗憾的是它并不是那么简单。

编辑:我想我应该说我是如何结束这篇文章的。我的想法是,肯定不包含数字的字符串不会被视为数字......好吧,我最终发现了这一点:

isNaN('a'); // true
isNaN(' '); // false

因此,即使它' '是一个非数字字符串,它显然也会被哄成一个数字 ( 0)。

console.log(Number(' ')); // 0.0

然而...

console.log( 0  ? true : false); // false
console.log(' ' ? true : false); // true

阅读更多内容后,我确实理解得更好了,但是哇,对于新手来说,这真是一场心理风暴,哈哈

于 2017-12-17T06:23:33.667 回答