NaN是否等于NaN?

问题描述 投票:42回答:8
parseFloat("NaN")

返回“NaN”,但是

parseFloat("NaN") == "NaN"

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

javascript function nan parseint parsefloat
8个回答
34
投票

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

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


33
投票

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

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


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()仅在参数类型为number时返回true,或者如果它的类型为string,则它可以强制转换为有限数字。在所有其他情况下,它返回false。


10
投票

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

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

8
投票
  • Number(由ParseFloat返回)与string string转换为Number相比时
  • NaN不等于任何其他对象(包括NaN

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


5
投票

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

1
投票

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


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

大声笑我觉得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

阅读更多后,我确实理解它好一点,但哇新手的心理弊端大声笑

© www.soinside.com 2019 - 2024. All rights reserved.