你如何检查一个数字是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); }
这背后的逻辑是除了0
和NaN
之外的每个数字都被转换为true
。
我已经做了一个快速的testing,它的performance和Number.isNaN
一样好,并且检查自己的错误。 三人都比isNan
performance得更好
结果
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 == null
为false
。 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"); }