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