parseFloat("NaN")
回报 “南”,但NaN是否等于NaN?
parseFloat("NaN") == "NaN"
返回false。现在,这可能是它并返回false个好东西,但我不知道怎么会这样。 JavaScript的创造者是否仅仅把它作为一个特例呢?因为否则我不明白这是怎么回事。
parseFloat("NaN")
回报 “南”,但NaN是否等于NaN?
parseFloat("NaN") == "NaN"
返回false。现在,这可能是它并返回false个好东西,但我不知道怎么会这样。 JavaScript的创造者是否仅仅把它作为一个特例呢?因为否则我不明白这是怎么回事。
当一个JavaScript函数返回NaN
,这不是一个字符串但在全球空间的对象属性。您无法将其与字符串"NaN"
进行比较。
见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
NaN不是一个对象;这是一个特殊的原始值。 (这正好是全局对象的只读属性的值)。 –
@Henning良好的发现,解决了我的答案 – Phil
Number
(由ParseFloat返回)比较了string
string
转换为Number
NaN
不等于任何其他对象(包括NaN
)你得到NaN==NaN
。第二条规则是错误的。
更新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()
。
如果你看一看this Stack Overflow question,你会发现很多的时间在那里isNaN()
回报你会直观地被认为是“不正确”的答案,而是通过正确的规范。
避免香草isNaN()
的一个重要原因是null
将返回false
,使您认为它是一个数字。但是,jQuery函数涵盖了更多的直观结果。
从他们的文档:
在jQuery 3.0 $ .isNumeric(的)仅当参数是 类型号返回true,或者如果它是字符串类型,它可以强迫 有限数。在所有其他情况下,它返回false。
这与jQuery无关。什么? – user1596138
仅仅因为jQuery改变了他们正在使用的功能并不意味着你必须这样做。 –
NaN
是一个不等于自身的对象的少数例子之一。事实上,这个非常属性是用来实现共同bool IsNaN(number)
方法:
function isNaN(x)
{
return x != x;
}
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
在ECMAScript中6 Object.is()是增强===。 该方法接受两个参数,如果值相等,则返回true。当两个值具有相同类型并具有相同值时,这两个值被认为是等价的。 这就是原因,因为执行console.log(Object.is(NAN,NAN)) - > TRUE
我与谷歌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一个新手笑
阿楠是永远不会等于本身的定义。它可以用任何语言以这种方式工作。 – Keith
请注意[我的答案在下面](http://stackoverflow.com/a/12628417/1195056)作为检查此的一种精确方法已添加ECMAScript 6. – krillgar
事件最好的部分是'parseFloat(“A”) == parseFloat(“A”)'return'false' –