Javascript NaN等于NaN吗?

Javascript NaN等于NaN吗?,javascript,function,nan,parseint,parsefloat,Javascript,Function,Nan,Parseint,Parsefloat,返回“NaN”,但是 返回false。现在,这可能是一件好事,它确实返回false,但我不明白这是怎么回事。JavaScript的创造者是否只是将此作为一个特例?因为否则我无法理解它如何返回false。当JavaScript函数返回NaN时,这不是一个文本字符串,而是全局空间中的一个对象属性。无法将其与字符串“NaN”进行比较 请参见这是一个特例,NaN是Javascript中唯一不等同于自身的东西 尽管关于字符串与NaN对象的其他答案也是正确的。 当Number(由ParseFloat返回)与

返回“NaN”,但是


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

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


请参见

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

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

  • Number
    (由ParseFloat返回)与
    string
    string
    进行比较时,转换为
    Number
  • NaN
    不等于任何其他对象(包括
    NaN
您得到
NaN==NaN
。根据第二条规则,它是错误的。

更新2

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

原创

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

parseFloat("NaN") == "NaN"
如果要检查的内容是NaN,则该函数将返回true。此方法内置于JavaScript规范中

使用jQuery

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

jQuery的更新

在jQuery1.7之后,他们将此函数更改为

如果您仔细看一看,您会发现很多时候,
isNaN()
会返回直觉上被认为是“不正确”的答案,但根据规范是正确的

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

根据他们的文件:

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


NaN
是少数几个不等于自身的对象示例之一。事实上,此属性用于实现常见的
bool-IsNaN(number)
方法:

isNaN(parseInt(variable))

isNaN
适用于所有非数字的值

function isNaN(x)
{ 
    return x != x; 
}
但是,如果您想特别检查
NaN
,或者避免类型强制
您可以改用
Number.isNaN

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

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

我正在使用谷歌应用程序脚本,所以我一直使用ECMA 5。与电咖啡的答案类似,以下是我能够找到的答案,它似乎给出了一个确定的答案,即一个值是否实际上是
NaN
,而不是一个值是否是
NaN
,而是如果它实际上是
NaN
本身:

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
哈哈,有趣的是,
Object.prototype.toString.call(NaN)
等于
'[objectnumber]'
。我的新手大脑告诉我,
NaN
不是一个数字,但遗憾的是,它并不是那么简单

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

function isThisNaN(x)
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
}
console.log(isThisNaN(NaN)); // true
因此,即使
'
是一个非数字字符串,它显然也会被哄成一个数字(
0

然而

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

读了更多的书后,我确实对它有了更好的理解,但是哇,对于一个新手来说,这是多么糟糕的一场心理风暴啊哈哈

那么为什么“NaN”==“NaN”会变成真的呢?返回false可能没有意义,但是…@joseph“NaN”==“NaN”正在比较两个(相等的)字符串。根据定义,NaN永远不等于它自己。它在任何语言中都是这样工作的。注意,ECMAScript 6中添加了一种精确的检查方法。事件最好的部分是
parseFloat(“a”)==parseFloat(“a”)
返回
false
@MariuszJamro,这是因为
parseFloat(“a”)
在每一侧返回
NaN
。正如答案所述,
NaN
甚至不等于它本身。
parseFloat(“NaN”)==NaN
NaN不是一个对象;它是一个特殊的原始值。(恰好是全局对象的只读属性的值)。这与jQuery无关。什么?仅仅因为jQuery更改了他们正在使用的函数并不意味着你必须这样做。
parseInt()
parseFloat()
有一个相当大的问题,那就是接受字符串中出现在有效数字之后的“垃圾”字符。这看起来很滑稽,JavaScript将示例从C更改为JavaScript。“很少有示例”?还有别的吗?如果是这样,那么这个实现在其他示例中失败。
NaN
根本不是一个对象,它是一个类型为number的常量。
isNaN('a'); // true
isNaN(' '); // false
console.log(Number(' ')); // 0.0
console.log( 0  ? true : false); // false
console.log(' ' ? true : false); // true