如何在 JavaScript 中检查数字是否为 NaN?

By simon at 11 天前 • 0人收藏 • 15人看过

我只是在 Firefox 的 JavaScript 控制台上尝试了一下,但是下面的语句都没有返回 true:

Parsefloat ('geoff') NaN; parseFloat ('geoff') number. NaN;
31 个回复 | 最后更新于 11 天前
11 天前   #1

你应该使用全局Isnan (value)函数调用,因为:

  • 它支持跨浏览器
  • Isnan作为文件

例子:

Isnan ('geoff') ; / / true isNaN ('3') ; / false

我希望这对你有帮助。

11 天前   #2

试试这个代码:

Isnan (parseFloat ("geoff"))

为了检查任何值是 NaN,而不仅仅是数字,看这里:如何在 Javascript 中测试 NaN?

11 天前   #3

使用以下代码:

Isnan ('geoff') ; 

Isnan ()文件.

Alert (isNaN ('abcd')) ; / alerts true alert (isNaN ('2.0') ; / alerts false alert (isNaN (2.0)) ; / alerts false
11 天前   #4

我使用下划线Isnan函数,因为在 JavaScript 中:

Isnan (undefined)-true

至少,要意识到这个问题。

11 天前   #5

Nan 是一个特殊的值,不能像那样进行测试。 我想和大家分享的一件有趣的事情是

如果(nanValue! / / Returns true! Alert ('nanValue is NaN') ; 

返回 true是一种安全的测试方法。 应该肯定地包装在一个函数或至少注释,因为它没有太多的意义,显而易见的测试,如果同一个变量不等于彼此,呵呵。

11 天前   #6

似乎 Node.js 不支持开箱即用的 isNaN ()。
和我一起工作的人

Var 值1; if (parseFloat (stringValue) +""! 值 parseFloat (stringValue) ; 
11 天前   #7

我在书中偶然发现了这个技巧有效的 JavaScript这很简单

因为 NaN 是唯一一个被视为不等于自身的 JavaScript 值,所以你总是可以通过检查一个值是否等于它本身来测试它是否是 NaN:

A! a! a! A; / / true var b"foo"; b! / / false var c undefined; c! / / false var d {} ; d! 如果你想知道更多的信息,请访问我们的网站! E; / / false

直到@allsyed 评论才意识到这一点,但这是 ECMA 规范中的:Https://tc39.github.io/ecma262/#sec-isnan-number

11 天前   #8

虽然@chiborg 的回答是正确的,但是还有更多值得注意的地方:

Parsefloat ('1.2 geoff') ; / / 1.2 isNaN (parseFloat ('1.2 geoff')) ; / / false isNaN ('. 2 geoff') ; / false isNaN (parseFloat ('. 2 geoff') ; / true

重点是,如果您使用这种方法来验证输入,结果将是相当自由的。

所以,是的,你可以使用Parsefloat (string)(或全数的情况下Parseint (字符串,基数)然后把它包起来Isnan (),但要注意数字和其他非数字字符交织在一起的问题。

11 天前   #9

为了解决这个问题1.2分,杰夫变成解析,只要使用号码()而是解析器。

所以,与其这样:

Parsefloat ('1.2 geoff') ; / / 1.2 isNaN (parseFloat ('1.2 geoff')) ; / / false isNaN ('. 2 geoff') ; / false isNaN (parseFloat ('. 2 geoff') ; / true

这样做:

Number ('1.2 geoff') ; / / NaN isNaN (Number ('1.2 geoff') ; / / true isNaN (Number ('. 2 geoff')) ; / true isNaN (Number ('geoff')) ; / true

编辑: 我刚刚注意到另一个问题,虽然... 假值(真实的布尔值为真)传入号码()作为0! 在这种情况下,parseFloat 每次都会起作用。 所以回到这个问题上来:

函数 definitelyNaN (val){ return isNaN (val & val! 真的吗? Number (val) : parseFloat (val) ; }

这似乎涵盖了一切。 我认为它比 lodash 的慢了90% . Isnan但是这个不包括所有的 NaN:

Http://jsperf.com/own-isnan-vs-underscore-lodash-isnan

先说清楚,我负责人类对"Not a Number"的文字解释,而 lodash 负责计算机文字解释,检查某个东西是否是"NaN"。

11 天前   #10

我只是想分享另一个选择,它不一定比这里的其他选择更好,但我认为它值得一看:

函数 customIsNaN (x){ return (typeof x'number'& x! 0 & & ! 1.1.1.1.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2

这背后的逻辑是,每个数字除了0及南投向真的.

我已经做了一个快速测试,它表现得和数字以及检查自身是否是错误的。 三者的表现都优于Isnan

结果

Customisnan (NaN) ; / / true customIsNaN (0 / 0) ; / / true customIsNaN (+ new Date ('?')) ; / / true customIsNaN (0) ; / / false customIsNaN (false) ; / / false customIsNaN (null) ; / false customIsNaN (undefined) ; / false customIsNaN ({}) ; / / false customIsNaN (") ; / false

可能成为有用的,如果你想避免破碎Isnan函数。

11 天前   #11

根据 IEEE 754,所有涉及 NaN 的关系评估为 false,除非! =. 因此,举例来说,如果 a 或 b 或两者都是 / are NaN,则(a b) false 和(a b) false。

11 天前   #12
Nan; / / false number.NaN; / false isNaN (NaN) ; / true isNaN (number.NaN) ; / true

不能使用相等运算符(和)根据 NaN 测试值。

你看文档全局 NaN 属性是一个表示 Not-A-Numbe 的值

最好的方法是使用'isNaN ()',这是一个引入函数来检查 NaN。 所有的浏览器都支持这种方式。 .

11 天前   #13

简单的解决方案!

真的超级简单! 这里! 有这个方法!

函数是真正的 nan (a){ return a! 一个; } ; ;

使用简单如下:

如果! Isreallynan (value)){ return doingStuff; }

参见性能测试这里使用这个 func vs选择答案

另外: 参考下面的第一个例子,了解几个备选实现。


例子:

函数是真正的 nan (a){ return a! Var example {'NaN': NaN,'an empty Objet': {} ,'a parse to NaN': parseFloat ('$5.32') ,'a non-empty Objet': { a: 1,b: 2} ,'an empty Array': [] ,'a semi-passed': parseInt ('5a5') ,'a non-empty Array': ['a','b','c'] ,'Math to NaN': Math.log (- 1) ,'an undefined object': undefined } for (x in example){ answer (example [ x ]) ,answer strer.tostring () ; $("table"). Append ($("tr /",{"class": strAnswer }). Append ($("th /",{ html: x }) ,$("td /",{ html: strAnswer }))})} ;
1px solid; padding: 2px 5px; }. 1.1.1.1.2.2.2.2.2.2.3.3.3.3.3.3.3.3.3.3.3.3. 绿色; }
Script src"https: / / ajax.google.com / ajax / libs / jquery / 1.9.1 / jquery.min.js"/ script table / table

如果您不想使用一个交替命名的方法,并且希望确保它更加全局可用,那么您可以选择一些替代路径来实现它。警告这些解决方案涉及修改本机对象,并且可能不是最佳解决方案。 始终谨慎使用,并注意您可能使用的其他库可能依赖于本机代码或类似的修改。

替代实现1: 替换本机Isnan方法。

/ / 非常简单。 只需简单地写下方法。 函数(a){ return a! 1; a; }

备用实现2: 附加到 Number 对象
* 建议,因为它也是一个多边形填充的 ECMA 5至6

数字['isNaN'] | (Number.isNaN 函数(a){ return a! A }) ; / / 使用像 Number.isNaN (NaN)一样简单

替代解决方案测试是否是空的

我编写了一个简单的窗口方法来测试对象是否是空空如也. 这是一个小的不同,它没有给如果项目是"没错"NaN,但我认为我会抛出这一点,因为它可能也是有用的时候,寻找空项目。

/ * * isEmpty (varried) * 简单方法,用于测试项目是否为"空"* * / ; (function (){ function isEmpty (a){ return (! A | | 0 a) | ("object"type of a & & / {} | [(null (,) *) * ] / . Test (JSON.stringify (a)) ; } ; window.hasOwnProperty ("empty") | (window.empty isEmpty) ; })() ;

例子:

函数 isEmpty (a){ return! 我不知道你在说什么! A | | 0 a | |"object"type of a & / {} | [(null (,) * )] / . 句子太长,请短一点。 Append ($("tr /",{"class": strAnswer }). Append ($("th /",{ html: x }) ,$("td /",{ html: strAnswer.toUpperCase ()})})} ; 函数 isReallyNaN (a){ return a! A; } ; for (x in example){ var answer is reallynan (example [ x ]) ,strAnswer. tostring () ; $("# t2"). Append ($("tr /",{"class": strAnswer }). Append ($("th /",{ html: x }) ,$("td /",{ html: strAnswer.toUpperCase ()})})} ;
1px solid; padding: 2px 5px; }. 1.1.1.1.2.2.2.2.2.2.3.3.3.3.3.3.3.3.3.3.3.3. 绿色; }
Http: / / ajax.googleapis. com / ajax / libs / jquery / 1.9.1 / jquery.min.js"/ script table id"t1"th colspan"2"isEmpty () / th / tr / tr / table id t2"tr head 2"isnan () / th / tr / head th / tr / th Return / ol"

非常深的检查是否为空

最后一个有点深入,甚至检查一个 Object 是否充满了空对象。 我确信它还有改进的空间和可能的缺陷,但是到目前为止,它似乎抓住了大部分的东西。

函数 isEmpty (a){ if (! 回来吧! 0; if ("object"typeof a){ var b JSON.stringify (a). 替换(/"[ ^"] *": (0 |"0 *"| false | null {} | [(null (,) ?)) *\]),? / g). 替换(/"[ ^"] *": } ,? / g) ; if (/ ^ $|  | [] / . 测试(b))返回! 0; else if (a instanceof Array){ b.replace (/ (0 |"0 *"| false | null | {(null (,) ?)) *\]),? / g) ; if (/ ^ $|  | [] / . 测试(b))返回! 0; }} return false; } window. Hasownproperty ("empty") | |  句子太长,请短一点。 Tostring () ; $("# t1"). Append ($("tr /",{"class": strAnswer }). Append ($("th /",{ html: x }) ,$("td /",{ html: strAnswer.toUpperCase ()})})} ; 函数 isReallyNaN (a){ return a! A; } ; for (x in example){ var answer is reallynan (example [ x ]) ,strAnswer. tostring () ; $("# t2"). Append ($("tr /",{"class": strAnswer }). Append ($("th /",{ html: x }) ,$("td /",{ html: strAnswer.toUpperCase ()})})} ;
1px solid; padding: 2px 5px; }. 1.1.1.1.2.2.2.2.2.2.3.3.3.3.3.3.3.3.3.3.3.3. 绿色; }
Http: / / ajax.googleapis. com / ajax / libs / jquery / 1.9.1 / jquery.min.js"/ script table id"t1"th colspan"2"isEmpty () / th / tr / tr / table id t2"tr head 2"isnan () / th / tr / head th / tr / th Return / ol"
11 天前   #14

如果您的环境支持 ECMAScript 2015,然后你可能想使用数字来确定这个值是否真的南.

问题是Isnan就是如果对非数值数据使用这种方法,则应用的混乱规则很少(按 MDN 计算)。比如说

Isnan (NaN) ; / / true isNaN (undefined) ; / true isNaN ({}) ; / / true

因此,在 ECMA Script 2015支持的环境中,您可能希望使用

Number.isnan (parseFloat ('geoff'))
11 天前   #15

就类型的值而言数目就是测试它是否是一个南或者不是,全局功能Isnan会做的工作

Isnan (any-Number) ; 

对于适用于 JS 中所有类型的通用方法,我们可以使用以下任何一种:

Ecmascript-5用户:

# 1 if (x! { console.info ('x is NaN.') { console.info ('x 不是 NaN.') ;
}

对于使用 ECMAScript-6的用户:

# 2 Number.isNaN (x) ;

为了保证 ECMAScript 5和6的一致性,我们也可以使用这个用多边形填充数字

# 3 / / Polyfill from MDN Number.isNaN Number.isNaN | | function (value){ return typeof value"number"& isNaN (value) ; } / / Or Number.isNaN Number.isNaN | function (value){ return value! 2.1.1

请查一下这个答案,了解详情。

11 天前   #16

我写这个回答的另一个问题Stackoverflow另一个什么时候检查Nan null但后来它被标记为复制品,所以我不想浪费我的工作。

你看Mozilla Developer Network关于南.


简短的回答

只要使用距离 | 0当你想确定你的价值是一个正确的数字或Isnan ()检查一下。

答案很长

Nan (Not-a-Number)是一个奇怪的 javascript 全局对象,当某些数学运算失败时常常返回。

你想知道Nan null结果就是虚假的. 甚至还可以挖洞南南结果虚假的.

一个简单的方法来确定变量是否是南是一个全局函数Isnan ().

另一个原因是X! X只有当 x 是 NaN 的时候才是正确的。 (谢谢提醒@raphael-schweikert)

但是为什么这个简短的回答起作用了呢?

让我们拭目以待。

当你打电话的时候Nan false结果就是虚假的,与真的.

在规范中的某个地方,JavaScript 有一个总是错误值的记录,其中包括:

  • 南不是号码
  • ""空字符串
  • 虚假的- a boolean false
  • 无效的- 空对象
  • 未定义的- 未定义的变量
  • 0- 数字0,包括 + 0和-0
11 天前   #17

截至Es6,反对。 .)是一个新的实用程序,可用于测试两个值的绝对相等性:

Var a 3 /'bar'; Object.is (a,NaN) ; / / true
11 天前   #18

另一个解决方案在的 parseFloat 页面

它提供了一个过滤器函数来进行严格的解析

Var filterFloat 函数(value){ if (/ ^ (| | +) ? ([0-9] + (. [0-9] +) ? | Infinity) $/ . 句子太长,请短一点

然后你可以使用Isnan看看是不是南

11 天前   #19

确切的检查方法是:

/ / 照顾 boolen,undefined and empty isNaN (x) | | typeof (x)'boolean'| | typeof (x) ! 未定义的! =='' ? 'is really a nan':'is a number'
11 天前   #20

我创建了这个小函数,它的工作原理就像魔法一样。 与其检查看起来与直觉相反的 NaN,不如检查一个数字。 我很确定我不是第一个这样做的人,但是我想我应该分享一下。

函数 isNum (val){ var absVal Math.abs (val) ; var retval false; if (((absVal-absVal)0){ retval true }返回 retval; }
11 天前   #21

只需将结果转换为 String 并与'NaN'进行比较。

Var val Number ("test") ; if (String (val)'NaN'){ console.log ("true") ; }
11 天前   #22

找到了另一种方式,只是为了好玩。

函数实际上是 nan (obj){ return [ obj ]。 包括(NaN) ; }
11 天前   #23

Marksyzm 的回答很好,但是它不会返回 false for无限因为"无限"不是一个数字。

我想到了一个Isnumber函数将检查它是否是一个数字。

函数 isNumber (i){ return! Isnan (i & i! 真的吗? 数(i) : parseFloat (i) & & [ Number.positive INFINITY,Number.negative INFINITY ]。 Indexof (i)-1; } console.log (isNumber (Infinity)) ; console.log (isNumber ("asdf")) ; console.log (isNumber (1.4)) ; console.log (isNumber (NaN)) ; console.log (isNumber (Number.MAX VALUE)) ; console.log (isNumber ("1.68")) ;

更新: 我注意到这个代码在一些参数上失败了,所以我把它做得更好。

函数 isNumber (i){ / / function,用于检查参数是否为 number if (! 抛出新的 SyntaxError ("没有足够的参数") } else if (arguments.length 1){ throw new SyntaxError ("too many arguments.") 如果[ number.negativeinfinity,Number.POSITIVE INFINITY ]。 Indexof (i) ! - 1){抛出新的 RangeError ("number can not be  xB1infinity.") } else if (typeof i"object"& ! (我是 RegExp 公司的) & ! (我代表数字) & & ! (i null)){ throw new TypeError ("parameter can not be object / array.") } else if (i instanceof RegExp){ throw new TypeError ("parameter can not be RegExp.") } else if (i null | i undefined){ throw new ReferenceError ("parameter is null or undefined.") 返回! Isnan (i & i! 真的吗? Number (i) : parseFloat (i) & & (i i) ; } console.log (isNumber (Infinity)) ; console.log (isNumber (this)) ; console.log (isNumber (/ . / ig) ; console.log (isNumber (null)) ;
11 天前   #24
警报(「1234567890」 . Indexof (String.fromCharCode (mycharacter))-1) ;

这一点也不优雅。 但是在尝试了 isNAN ()之后,我得到了这个解决方案,这是另一个选择。 在这个例子中我也允许'.' 因为我是为浮动屏蔽。 您还可以反过来确保不使用任何数字。

(「1234567890」。 Indexof (String.fromCharCode (mycharacter))-1)

这是一个单字符计算,但是您也可以循环通过一个字符串来检查任何数字。

登录后方可回帖

Loading...