NaN 是不是等于 NaN?

Posted

技术标签:

【中文标题】NaN 是不是等于 NaN?【英文标题】:Is NaN equal to NaN?NaN 是否等于 NaN? 【发布时间】:2011-10-22 01:08:05 【问题描述】:
parseFloat("NaN")

返回“NaN”,但是

parseFloat("NaN") == "NaN"

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

【问题讨论】:

根据定义,NaN 永远不等于自身。它适用于任何语言。 注意 my answer below 作为检查此问题的精确方法已添加到 ECMAScript 6 中。 事件最好的部分是parseFloat("A") == parseFloat("A")返回false @MariuszJamro 那是因为parseFloat("A") 在每一侧都返回NaN。正如答案所涵盖的那样,NaN 甚至不等于它自己。 parseFloat("NaN") == NaN NaN 有毒。使用isNaN() 【参考方案1】:

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

【讨论】:

【参考方案2】:

我正在使用 Google Apps 脚本,所以我坚持使用 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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

更新 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() 仅当参数为 类型号,或者如果它是字符串类型并且可以强制转换为 有限的数字。在所有其他情况下,它返回 false。

【讨论】:

这与jQuery无关。什么? 仅仅因为 jQuery 改变了他们正在使用的函数并不意味着你必须这样做。 parseInt()parseFloat() 在接受出现在字符串中有效数字之后的“垃圾”字符方面存在相当严重的问题。【参考方案5】:

NaN 是少数几个不等于自身的对象之一。其实这个属性就是用来实现常见的bool IsNaN(number)方法的:

function isNaN(x)
 
    return x != x; 

【讨论】:

看起来很有趣 javascript 将示例从 C# 更改为 JavaScript。 “几个例子”?还有一个吗?如果是这样,则此实现在其他示例上失败。 NaN 根本不是一个对象,它是一个类型为 number 的常量。【参考方案6】:

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

见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

【讨论】:

NaN 不是对象;它是一个特殊的原始值。 (这恰好是全局对象的一个只读属性的值)。【参考方案7】:Number(由 ParseFloat 返回)与string 比较时,string 转换为Number NaN 不等于任何其他对象(包括NaN

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

为什么 "NaN" == "NaN" 返回真?返回 false 可能没有意义,但是... @joseph "NaN" == "NaN" 正在比较两个(相等的)字符串。

以上是关于NaN 是不是等于 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 1**Inf 的值等于 1,而不是 NaN?

为什么 NaN 不等于自身?

Single.NaN 不等于自身?

使给定行号的所有元素等于 NaN

NaN不等于NaN

神马是 NaN,它的类型是神马?怎么测试一个值是否等于 NaN?