2011-08-08 48 views
38
parseFloat("NaN") 

回报 “南”,但NaN是否等于NaN?

parseFloat("NaN") == "NaN" 

返回false。现在,这可能是它并返回false个好东西,但我不知道怎么会这样。 JavaScript的创造者是否仅仅把它作为一个特例呢?因为否则我不明白这是怎么回事。

+14

阿楠是永远不会等于本身的定义。它可以用任何语言以这种方式工作。 – Keith

+0

请注意[我的答案在下面](http://stackoverflow.com/a/12628417/1195056)作为检查此的一种精确方法已添加ECMAScript 6. – krillgar

+0

事件最好的部分是'parseFloat(“A”) == parseFloat(“A”)'return'false' –

回答

31

当一个JavaScript函数返回NaN,这不是一个字符串但在全球空间的对象属性。您无法将其与字符串"NaN"进行比较。

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

+17

NaN不是一个对象;这是一个特殊的原始值。 (这正好是全局对象的只读属性的值)。 –

+0

@Henning良好的发现,解决了我的答案 – Phil

30

这是一个特殊的情况下,陈楠在Javascript中唯一不等于本身。

虽然关于字符串VS NaN的物体其他的答案是正确的了。

+1

为什么“NaN”==“NaN”返回true?它可能没有任何意义,返回false,但... – joseph

+26

@joseph“NaN”==“NaN”比较两个(相等)的字符串。 – dlev

8
  • Number(由ParseFloat返回)比较了stringstring转换为Number
  • NaN不等于任何其他对象(包括NaN

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

28

更新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,或者如果它是字符串类型,它可以强迫 有限数。在所有其他情况下,它返回false。

+12

这与jQuery无关。什么? – user1596138

+0

仅仅因为jQuery改变了他们正在使用的功能并不意味着你必须这样做。 –

9

NaN是一个不等于自身的对象的少数例子之一。事实上,这个非常属性是用来实现共同bool IsNaN(number)方法:

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

这看起来好笑* javascript * –

+3

将示例从C#更改为JavaScript。 –

+1

“几个例子”?还有吗?如果是这样,这个实现在其他例子上失败。 – djechlin

4

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

我与谷歌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 

阅读更后我明白了一点更好,但哇什么心理crapstorm一个新手笑