NaN是否等于NaN?

时间:2011-08-08 00:15:35

标签: javascript function nan parseint parsefloat

parseFloat("NaN")

返回“NaN”,但

parseFloat("NaN") == "NaN"

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

8 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:33)

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

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

答案 2 :(得分:33)

更新2

ECMAScript 6的新功能是Object.is()功能。这旨在进一步增强===检查。这个新函数的一个好处是Object.is(NaN, NaN)现在将返回true。如果你是able to utilize ECMAScript 6,那么这将是最可读和最一致的解决方案。

<强>原始

检查这个的正确方法是:

isNaN(parseInt(variable))

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

使用jQuery

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

jQuery更新

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

Documentation of the switch

如果您查看this Stack Overflow question,您会发现很多次isNaN()返回的内容会直观地被视为“不正确”的答案,但规格是正确的。

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

从他们的文件:

  

从jQuery 3.0开始,$ .isNumeric()仅在参数为true时才返回true   类型编号,或者如果它是字符串类型,它可以被强制进入   有限数。在所有其他情况下,它返回false。

答案 3 :(得分:10)

NaN是一个与自身不相等的对象的少数例子之一。实际上,这个属性用于实现常见的bool IsNaN(number)方法:

function isNaN(x)
{ 
    return x != x; 
}

答案 4 :(得分:8)

  • Number(由ParseFloat返回)与转换为string的{​​{1}} string进行比较时
  • Number不等于任何其他对象(包括NaN

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

答案 5 :(得分:7)

isNaN适用于非数字的所有值

isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true

但是,如果您想要专门检查NaN,或者避免类型强制;您可以使用Number.isNaN代替

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false

答案 6 :(得分:1)

在ECMAScript 6中,Object.is()是===的增强。 此方法接受两个参数,如果值相等,则返回true。当两个值具有相同类型且具有相同值时,它们被视为等效。 这是因为console.log(Object.is(NaN,NaN)) - &gt; TRUE

答案 7 :(得分:0)

我正在使用Google Apps脚本,因此我坚持使用ECMA 5.与电咖咖啡的答案类似,这里我能够弄清楚这似乎是确定一个值是否实际为NaN,而不是值NaN但是它实际上是NaN本身:

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

lol对我来说很有意思Object.prototype.toString.call(NaN)等于'[object Number]'。我的新手大脑告诉我NaN是&#34;不是数字&#34;但遗憾的是,它并不那么简单。

编辑: 我想我应该说我最后是怎么看到这篇文章的。我认为肯定一个不包含数字的字符串不会被视为一个数字......好吧,我最终发现了这个:

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

所以即使' '是一个非数字字符串,它显然会被哄骗成一个数字(0)。

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

...然而

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

阅读更多后,我确实理解它好一点但哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇