你如何检查一个数字是NaN的JavaScript?

我只在Firefox的JavaScript控制台中试过,但是下面的两个语句都没有返回true:

parseFloat('geoff') == NaN; parseFloat('geoff') == Number.NaN; 

试试这个代码:

 isNaN(parseFloat("geoff")) 

为了检查是否有任何值是NaN,而不是只是数字,请看这里: 你如何testingNaN的JavaScript?

我刚刚在“ 有效的JavaScript ”一书中遇到了这个技巧,这很简单:

由于NaN是唯一被视为不等于自身的JavaScript值,因此您可以始终通过检查它是否与NaN相等来testing值是否为NaN:

 var a = NaN; a !== a; // true var b = "foo"; b !== b; // false var c = undefined; c !== c; // false var d = {}; d !== d; // false var e = { valueOf: "foo" }; e !== e; // false 

直到@allsyed评论,没有意识到这一点,但这是在ECMA规范: https ://tc39.github.io/ecma262/#sec-isnan-number

使用此代码:

 isNaN('geoff'); 

请参阅MDN上的isNaN()文档 。

 alert ( isNaN('abcd')); // alerts true alert ( isNaN('2.0')); // alerts false alert ( isNaN(2.0)); // alerts false 

只要Numbertypes的值被testing,它是否是NaN ,全局函数是NaN将做的工作

 isNaN(any-Number); 

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

对于ECMAScript-5用户:

 #1 if(x !== x) { console.info('x is NaN.'); } else { console.info('x is NOT a NaN.'); } 

对于使用ECMAScript-6的用户:

 #2 Number.isNaN(x); 

为了达到ECMAScript 5&6的一致性目的,我们也可以使用这个填充Number.isNan

 #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 !== value; } 

请查看本答复以了解更多详情。

NaN是一个不能像这样testing的特殊价值。 我只是想分享一个有趣的事情是这个

 var nanValue = NaN; if(nanValue !== nanValue) // Returns true! alert('nanValue is NaN'); 

这只对NaN值返回true,是一种安全的testing方式。 应该一定要包装成一个函数或者至less有一个注释,因为testing相同的variables是否相等并不是很明显,嘿嘿。

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

  • 它支持跨浏览器
  • 有关文档,请参阅isNaN

例子:

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

我希望这能帮到您。

虽然@chiborg的答案是正确的,但还有更多需要注意的地方:

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

要点是,如果你使用这种方法来validationinput,结果将是相当自由的。

所以,是的,你可以使用parseFloat(string) (或在全数字parseInt(string, radix) '的情况下,然后用isNaN()包装,但要知道与附加的非数字字符交织的数字。

要解决'1.2geoff'被parsing的问题,只需使用Number()parsing器。

所以不是这样的:

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

做这个:

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

编辑:我只是注意到从这个错误的另一个问题…错误的值(和真正的布尔)传递到Number()返回为0 ! 在这种情况下… parseFloat每一次都有效。 所以回到那个:

 function definitelyNaN (val) { return isNaN(val && val !== true ? Number(val) : parseFloat(val)); } 

这涵盖了所有的一切。 我以比lodash的_.isNaN慢了90%的基准,但是那个不包括所有的NaN:

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

只是要清楚,我的照顾人类的字面解释是“不是一个数字”和lodash的照顾计算机字面解释检查是否是“NaN”。

ES6开始Object.is(..)是一个新的实用程序,可用于testing绝对相等的两个值:

 var a = 3 / 'bar'; Object.is(a, NaN); // true 

简单解决scheme

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

 function isReallyNaN(a) { return a !== a; }; 

使用如下简单:

 if (!isReallyNaN(value)) { return doingStuff; } 

使用这个func vs select的答案 在这里看到性能testing

另外:见下面的第一个例子,一些替代实现。


例:

 function isReallyNaN(a) { return a !== 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 parse': parseInt('5a5'), 'a non-empty Array': [ 'a', 'b', 'c' ], 'Math to NaN': Math.log(-1), 'an undefined object': undefined } for (x in example) { var answer = isReallyNaN(example[x]), strAnswer = answer.toString(); $("table").append($("<tr />", { "class": strAnswer }).append($("<th />", { html: x }), $("<td />", { html: strAnswer }))) }; 
 table { border-collapse: collapse; } th, td { border: 1px solid; padding: 2px 5px; } .true { color: red; } .false { color: green; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <table></table> 

如果您的环境支持ECMAScript 2015 ,那么您可能需要使用Number.isNaN来确保该值真的是NaN

isNaN的问题在于, 如果将其用于非数字数据,那么应用了很less的混淆规则(按照MDN)。 例如,

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

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

 Number.isNaN(parseFloat('geoff')) 

看来isNaN()在开箱即用的Node.js中不受支持。
我曾与周围的工作

 var value = 1; if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue); 

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

 isNaN(undefined) -> true 

至less,要知道这个问题。

我只是想分享另一种select,这里不一定比其他人好,但我认为这是值得一看的:

 function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); } 

这背后的逻辑是除了0NaN之外的每个数字都被转换为true

我已经做了一个快速的testing,它的performance和Number.isNaN一样好,并且检查自己的错误。 三人都比isNanperformance得更好

结果

 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函数的破坏,可能会变得有用。

确切的检查方法是:

 //takes care of boolen, undefined and empty isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number' 

JavaScript中的NaN代表“不是数字”,尽pipe其types实际上是数字。

 typeof(NaN) // "number" 

要检查一个variables的值是否为NaN,我们不能简单地使用函数isNaN(),因为isNaN()存在以下问题,如下所示:

 var myVar = "A"; isNaN(myVar) // true, although "A" is not really of value NaN 

这里真正发生的是,myVar被隐含地强制为一个数字:

 var myVar = "A"; isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact 

这实际上是有道理的,因为“A”实际上不是一个数字。 但是,我们真正想要检查的是,如果myVar是完全有价值的NaN。

所以是NaN()不能帮助。 那我们该怎么做呢?

鉴于NaN是唯一被处理的不等于自身的JavaScript值,所以我们可以使用!==来检查它自己的相等性

 var myVar; // undefined myVar !== myVar // false var myVar = "A"; myVar !== myVar // false var myVar = NaN myVar !== myVar // true 

所以得出结论 ,如果variables!==本身是真的,那么这个variables的值就是NaN:

 function isOfValueNaN(v) { return v !== v; } var myVar = "A"; isNaN(myVar); // true isOfValueNaN(myVar); // false 

根据IEEE 754,除了!=之外,涉及NaN的所有关系都被评估为假。 因此,例如,如果A或B或两者都是NaN,则(A> = B)=假并且(A <= B)=假。

 NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true 

平等运算符(==和===)不能用于对NaN进行testing。

查看Mozilla文档全球NaN财产是代表Not-A-Numbe的值

最好的方法是使用“inNaN()”这个内置函数来检查NaN。 所有浏览器支持的方式..

我把这个答案写在StackOverflow的另一个问题上,当NaN == null时,另一个问题会被检查,但是它被标记为重复的,所以我不想浪费我的工作。

看看有关NaN Mozilla开发者networking 。


简短的回答

只要使用distance || 0 distance || 0当你想确定你的值是一个合适的数字或isNaN()来检查它。

长答案

NaN(Not-a-Number)是一个math运算失败时经常返回的javascript中的一个奇怪的全局对象。

你想检查NaN == nullfalse 。 Hovewer甚至NaN == NaN导致false

查找variables是否为NaN简单方法是全局函数isNaN()

另一个是x !== x ,当x是NaN时才是真的。 (感谢@ raphael-schweikert提醒)

但为什么这个简短的答案奏效?

让我们找出来。

当您调用NaN == false ,结果为false ,与NaN == true相同。

规范中的某处JavaScript有一个始终为false的logging,其中包括:

  • NaN – 不是一个数字
  • "" – 空string
  • false – 一个布尔值false
  • null – null对象
  • undefined – 未定义的variables
  • 0 – 数字0,包括+0和-0

在MDN的parseFloat页面中提到了另一个解决scheme

它提供了一个过滤function来做严格的parsing

 var filterFloat = function (value) { if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/ .test(value)) return Number(value); return NaN; } console.log(filterFloat('421')); // 421 console.log(filterFloat('-421')); // -421 console.log(filterFloat('+421')); // 421 console.log(filterFloat('Infinity')); // Infinity console.log(filterFloat('1.61803398875')); // 1.61803398875 console.log(filterFloat('421e+0')); // NaN console.log(filterFloat('421hop')); // NaN console.log(filterFloat('hop1.61803398875')); // NaN 

然后你可以用isNaN来检查它是否是NaN

我创造了这个function就像一个魅力。 而不是检查NaN这似乎是违反直觉,你检查一个数字。 我很确定我不是第一个这样做,但我想我会分享。

 function isNum(val){ var absVal = Math.abs(val); var retval = false; if((absVal-absVal) == 0){ retval = true } return retval; } 

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

 function IsActuallyNaN(obj) { return [obj].includes(NaN); } 

marksyzm的答案效果很好,但对Infinity来说不会错的,因为Infinity不是一个数字。

我想出了一个isNumber函数,将检查它是否是一个数字。

 function isNumber(i) { return !isNaN(i && i !== true ? Number(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")); 
 alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1); 

这不是优雅的。 但尝试isNAN()后,我到了这个解决scheme,这是另一种select。 在这个例子中,我也允许'。' 因为我掩饰浮动。 你也可以反过来确保没有使用数字。

 ("1234567890".indexOf(String.fromCharCode(mycharacter))==-1) 

这是一个单一的字符评估,但你也可以通过string循环来检查任何数字。

 function isNotANumber(n) { if (typeof n !== 'number') { return true; } return n !== n; } 

(NaN> = 0) ?……“ 我不知道 ”。

 function IsNotNumber( i ){ if( i >= 0 ){ return false; } if( i <= 0 ){ return false; } return true; } 

条件只有在TRUE时才执行。

不是假的

不在“ 我不知道 ”。

只需将结果转换为string并与“NaN”进行比较。

 var val = Number("test"); if(String(val) === 'NaN') { console.log("true"); }