parseFloat("NaN")
返回“NaN”,但是
parseFloat("NaN") == "NaN"
返回false . 现在,这可能是一件好事,它确实会返回错误,但我不明白这是怎么回事 . JavaScript创建者是否只是将其作为一个特例?因为否则我无法理解这是如何返回false的 .
当JavaScript函数返回 NaN 时,这不是文字字符串,而是全局空间中的对象属性 . 您无法将其与字符串 "NaN" 进行比较 .
NaN
"NaN"
见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
Update 2
ECMAScript 6的新功能是Object.is()功能 . 这旨在进一步增强 === 检查 . 这个新函数的好处之一是 Object.is(NaN, NaN) 现在将返回true . 如果你是able to utilize ECMAScript 6,那么这将是最具可读性和一致性的解决方案 .
===
Object.is(NaN, NaN)
Original
检查这个的正确方法是:
isNaN(parseInt(variable))
如果您检查的是NaN,则该函数将返回true . 此方法内置于JavaScript规范中 .
Using jQuery
jQuery最初构建在自己的 isNaN 函数中,以帮助解决浏览器之间的一些差异,并添加一些额外的检查,以便可以使用它们的版本而不是VanillaJS中的版本 .
isNaN
Update for jQuery
在jQuery 1.7之后,他们将此函数更改为$.isNumeric() .
Documentation of the switch
如果你看一下this Stack Overflow question,你会发现很多次 isNaN() 返回的是直观的"incorrect"答案,但是规范是正确的 .
isNaN()
避免香草 isNaN() 的一个重要原因是 null 将返回 false ,让你认为它是一个数字 . 但是,jQuery函数涵盖了更大范围的直观结果 .
null
false
从他们的文件:
从jQuery 3.0开始,$ .isNumeric()仅在参数类型为number时返回true,或者如果它的类型为string,则可以强制转换为有限数字 . 在所有其他情况下,它返回false .
这是一个特例,NaN是Javascript中唯一不等于它自己的东西 .
虽然关于字符串与NaN对象的其他答案也是正确的 .
NaN 是一个与自身不相等的对象的少数例子之一 . 实际上,这个属性用于实现常见的 bool IsNaN(number) 方法:
bool IsNaN(number)
function isNaN(x) { return x != x; }
当 Number (由ParseFloat返回)与 string string 比较转换为 Number 时
Number
string
NaN 不等于任何其他对象(包括 NaN )
你得到 NaN==NaN . 第二条规则是错误的 .
NaN==NaN
isNaN 适用于非数字的所有值
isNaN('foo') == true isNaN(NaN) == true isNaN(12) == false isNaN([1,2,3]) == true
但是,如果你想特别检查 NaN ,或者避免类型强制;你可以改用 Number.isNaN
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
我坚持使用ECMA 5.类似于电咖啡's answer, here' s我能够弄清楚这似乎给出了一个确定的答案,即一个值是否实际上是 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 是"Not a Number"但遗憾的是它并不那么简单 .
Object.prototype.toString.call(NaN)
'[object Number]'
编辑:我想我应该说我是如何结束这篇文章的 . 我认为这肯定是一个字符串,不会被视为一个数字......好吧,我最终发现了这个:
isNaN('a'); // true isNaN(' '); // false
所以即使 ' ' 是一个非数字字符串,它显然会被哄骗成一个数字( 0 ) .
' '
0
console.log(Number(' ')); // 0.0
然而...
console.log( 0 ? true : false); // false console.log(' ' ? true : false); // true
阅读更多后,我确实理解它好一点,但哇新手的心理弊端大声笑
8 回答
当JavaScript函数返回
NaN
时,这不是文字字符串,而是全局空间中的对象属性 . 您无法将其与字符串"NaN"
进行比较 .见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
Update 2
ECMAScript 6的新功能是Object.is()功能 . 这旨在进一步增强
===
检查 . 这个新函数的好处之一是Object.is(NaN, NaN)
现在将返回true . 如果你是able to utilize ECMAScript 6,那么这将是最具可读性和一致性的解决方案 .Original
检查这个的正确方法是:
如果您检查的是NaN,则该函数将返回true . 此方法内置于JavaScript规范中 .
Using jQuery
jQuery最初构建在自己的
isNaN
函数中,以帮助解决浏览器之间的一些差异,并添加一些额外的检查,以便可以使用它们的版本而不是VanillaJS中的版本 .Update for jQuery
在jQuery 1.7之后,他们将此函数更改为$.isNumeric() .
Documentation of the switch
如果你看一下this Stack Overflow question,你会发现很多次
isNaN()
返回的是直观的"incorrect"答案,但是规范是正确的 .避免香草
isNaN()
的一个重要原因是null
将返回false
,让你认为它是一个数字 . 但是,jQuery函数涵盖了更大范围的直观结果 .从他们的文件:
这是一个特例,NaN是Javascript中唯一不等于它自己的东西 .
虽然关于字符串与NaN对象的其他答案也是正确的 .
NaN
是一个与自身不相等的对象的少数例子之一 . 实际上,这个属性用于实现常见的bool IsNaN(number)
方法:当
Number
(由ParseFloat返回)与string
string
比较转换为Number
时NaN
不等于任何其他对象(包括NaN
)你得到
NaN==NaN
. 第二条规则是错误的 .isNaN
适用于非数字的所有值但是,如果你想特别检查
NaN
,或者避免类型强制;你可以改用
Number.isNaN
在ECMAScript 6中,Object.is()是===的增强 . 此方法接受两个参数,如果值是等效的,则返回true . 当两个值具有相同类型且具有相同值时,它们被视为等效 . 这是因为console.log(Object.is(NaN,NaN)) - > TRUE
我坚持使用ECMA 5.类似于电咖啡's answer, here' s我能够弄清楚这似乎给出了一个确定的答案,即一个值是否实际上是
NaN
,而不是如果一个值是NaN
但是如果它实际上是NaN
本身:大声笑对我来说,
Object.prototype.toString.call(NaN)
等于'[object Number]'
. 我的新手大脑告诉我NaN
是"Not a Number"但遗憾的是它并不那么简单 .编辑:我想我应该说我是如何结束这篇文章的 . 我认为这肯定是一个字符串,不会被视为一个数字......好吧,我最终发现了这个:
所以即使
' '
是一个非数字字符串,它显然会被哄骗成一个数字(0
) .然而...
阅读更多后,我确实理解它好一点,但哇新手的心理弊端大声笑