parseFloat("NaN")
返回“NaN”,但是。parseFloat("NaN") == "NaN"
返回 false 值。这样做可能是有好处的,但我不明白为什么会这样。JavaScript 的创建者是否将其作为一个特殊情况来处理?否则我就不理解为什么会返回 false。
parseFloat("NaN")
返回“NaN”,但是。parseFloat("NaN") == "NaN"
返回 false 值。这样做可能是有好处的,但我不明白为什么会这样。JavaScript 的创建者是否将其作为一个特殊情况来处理?否则我就不理解为什么会返回 false。
更新2
ECMAScript 6中新增了Object.is()函数。该函数旨在进一步增强 ===
检查。这个新功能的好处之一是, Object.is(NaN,NaN)
现在将返回true。如果您能够使用ECMAScript 6, 那么这将是最可读和一致的解决方案。
原文
检查这个的正确方法是:
isNaN(parseInt(variable))
$.isNumeric()
。
切换文档
如果你看一下 此 Stack Overflow 问题,你会发现有很多时候 isNaN()
返回的答案会直观地被认为是“不正确”的,但在规范上是正确的。isNaN()
的一个主要原因是,null
会返回 false
,这会让你认为它是一个数字。然而,jQuery 函数涵盖了更广泛的直觉结果。parseInt()
和parseFloat()
存在一个相当严重的问题,即它们会接受出现在有效数字之后的“垃圾”字符。 - Pointy当JavaScript函数返回NaN
时,这不是字面上的字符串,而是全局空间中的对象属性。您不能将其与字符串"NaN"
进行比较。
请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
这是一个特殊情况,NaN是JavaScript中唯一不等于自身的东西。
虽然关于字符串与NaN对象的其他答案也是正确的。
NaN
是唯一一个不等于自身的对象之一。事实上,这个特性被用来实现常见的 bool IsNaN(number)
方法:
function isNaN(x)
{
return x != x;
}
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
Number
(由ParseFloat返回)与转换为Number
的string
进行比较时NaN
不等于任何其他对象(包括NaN
)你得到了NaN==NaN
。根据第二条规则,它是错误的。
我正在使用Google Apps Script,因此我被困在ECMA 5中。与Electric Coffee的答案类似,这是我能够找出的似乎可以确定一个值是否实际上是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
读了更多之后,我有点理解了,但对于新手来说,这真是一场脑力风暴。
parseFloat("A") == parseFloat("A")
返回false
。 - Mariusz JamroparseFloat("A")
在每个一侧都返回NaN
。正如其他答案所述,NaN
甚至不等于它自己。 - krillgarparseFloat("NaN") == NaN
<-- 这是一个比较有趣的问题(不包括引号)。仍然不行。NaN
是有毒的。请使用isNaN()
。 - Bob Stein