我只是在Firefox的JavaScript控制台中尝试过,但以下两个语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
试试这段代码:
isNaN(parseFloat("geoff"))
要检查是否有任何值是NaN,而不仅仅是数字,请参见此处:How do you test for NaN in Javascript?
非常简单!这里!有这种方法!
function isReallyNaN(a) { return a !== a; };
使用简单如下:
if (!isReallyNaN(value)) { return doingStuff; }
See performance test here使用这个func vs selected answer
另外:请参阅下面的第一个示例,了解其他几个实现。
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>
如果您不想使用交替命名的方法,并且希望确保它更全局可用,那么您可以采用几种替代路径来实现。警告这些解决方案涉及更改本机对象,可能不是您的最佳解决方案。请务必小心谨慎,并注意您可能使用的其他库可能依赖于本机代码或类似的更改。
isNaN
method.// Extremely simple. Just simply write the method.
window.isNaN = function(a) { return a !==a; }
Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });
// Use as simple as
Number.isNaN(NaN)
如果为空,则替代解决方案测试
我写的一个简单的窗口方法,测试对象是否为空。这有点不同,因为它没有给出物品是否“完全”NaN,但我想我会把它扔掉,因为它在寻找空物品时也可能有用。
/** isEmpty(varried)
* Simple method for testing if item is "empty"
**/
;(function() {
function isEmpty(a) { return (!a || 0 >= a) || ("object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a))); };
window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();
;(function() {
function isEmpty(a) { return !a || void 0 === a || a !== a || 0 >= a || "object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a)); };
window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();
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': new Array(),
'an empty Array w/ 9 len': new Array(9),
'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 = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
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 id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
最后一个有点深入,甚至检查对象是否充满了空白对象。我确信它有改进的空间和可能的坑,但到目前为止,它似乎捕获了大部分内容。
function isEmpty(a) {
if (!a || 0 >= a) return !0;
if ("object" == typeof a) {
var b = JSON.stringify(a).replace(/"[^"]*":(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '').replace(/"[^"]*":\{\},?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
else if (a instanceof Array) {
b = b.replace(/(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
}
}
return false;
}
window.hasOwnProperty("empty")||(window.empty=isEmpty);
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': new Array(),
'an empty Array w/ 9 len': new Array(9),
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined,
'Object Full of Empty Items': { 1: '', 2: [], 3: {}, 4: false, 5:new Array(3), 6: NaN, 7: null, 8: void 0, 9: 0, 10: '0', 11: { 6: NaN, 7: null, 8: void 0 } },
'Array Full of Empty Items': ["",[],{},false,[null,null,null],null,null,null,0,"0",{"6":null,"7":null}]
}
for (x in example) {
var answer = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
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 id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
如果您的环境支持ECMAScript 2015,那么您可能希望使用Number.isNaN
来确保该值确实是NaN
。
isNaN
的问题是,if you use that with non-numeric data there are few confusing rules (as per MDN) are applied.例如,
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
因此,在ECMA Script 2015支持的环境中,您可能希望使用
Number.isNaN(parseFloat('geoff'))
JavaScript中的NaN代表“非数字”,虽然它的类型实际上是数字。
typeof(NaN) // "number"
要检查变量是否具有值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值完全相同。
所以isNaN()无法帮助。那我们该怎么做呢?
鉴于NaN是唯一被视为不等于自身的JavaScript值,因此我们可以使用!==检查它与自身的相等性。
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
总而言之,如果变量!==本身是真的,那么这个变量正好是NaN的值:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
我只想分享另一种选择,它不一定比其他人更好,但我认为值得关注:
function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
这背后的逻辑是除了0
和NaN
之外的每个数字都被投射到true
。
我做了一个快速测试,它表现得和Number.isNaN
一样好,并且检查错误。这三个都比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
功能可能会有用。
在开箱即用的Node.js中似乎不支持isNaN()。 我一起工作
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
也许这个:
function isNaNCustom(value){
return value.toString() === 'NaN' &&
typeof value !== 'string' &&
typeof value === 'number'
}
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
等式运算符(==和===)不能用于测试针对NaN的值。
看看Mozilla Documentation The global NaN property is a value representing Not-A-Numbe
最好的方法是使用'isNaN()',它是检查NaN的内置函数。所有浏览器支持的方式..
确切的检查方法是:
//takes care of boolen, undefined and empty
isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
我刚刚在Effective JavaScript这本书中遇到过这种技巧,非常简单:
由于NaN是唯一被视为与其自身不相等的JavaScript值,因此您可以通过检查值是否为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
根据IEEE 754,除了!=之外,涉及NaN的所有关系都被评估为假。因此,例如,如果A或B或两者都是NaN,则(A> = B)=假并且(A <= B)=假。
我在StackOverflow的另一个问题上写了这个答案,其中另一个问题是NaN == null
,但后来它被标记为重复,所以我不想浪费我的工作。
看看Mozilla Developer Network关于NaN
。
当你想确定你的价值是一个正确的数字或distance || 0
来检查它时,只需使用isNaN()
。
NaN(非数字)是javascript中的怪异全局对象,当某些数学运算失败时经常返回。
你想检查qazxsw poi是否会导致qazxsw poi。然而,甚至qazxsw poi与NaN == null
结果。
找出变量是否是qazxsw poi的简单方法是全局函数qazxsw poi。
另一个是false
,只有当x是NaN时才是真的。 (感谢提醒@ raphael-schweikert)
我们来看看。
当你打电话给NaN == NaN
时,结果是false
,与NaN
相同。
在规范的某处,JavaScript有一个始终为false值的记录,其中包括:
isNaN()
- 非数字x !== x
- 空字符串NaN == false
- 布尔值假false
- null对象NaN == true
- 未定义的变量NaN
- 数字0,包括+0和-0""
提到了另一个解决方案
它提供了一个过滤功能来进行严格的解析
false
然后你可以使用null
来检查它是否是undefined
我创造了这个像魅力一样的小功能。您可以检查一个数字,而不是检查看似反直觉的NaN。我很确定我不是第一个这样做的人,但我想我会分享。
0
找到另一种方式,只是为了好玩。
MDN's parseFloat page
marksyzm的答案效果很好,但它并没有为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
返回错误,因为Infinity在技术上不是一个数字。
我想出了一个isNaN
函数,它将检查它是否是一个数字。
NaN
更新:我注意到这个代码失败了一些参数,所以我做得更好。
function isNum(val){
var absVal = Math.abs(val);
var retval = false;
if((absVal-absVal) == 0){
retval = true
}
return retval;
}
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
这不优雅。但是在尝试了isNAN()后,我找到了这个解决方案,这是另一种选择。在这个例子中我也允许'。'因为我正在掩饰浮动。您也可以将其反转以确保不使用任何数字。
Infinity
这是单个字符评估,但您也可以遍历字符串以检查任何数字。
是(NaN> = 0)?......“我不知道”。
isNumber
条件仅在TRUE时执行。
不是假的。
不是“我不知道”。
规则是:
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"));
isNaN()函数的问题是它可能在某些情况下返回意外结果:
function isNumber(i) {//function for checking if parameter is number
if(!arguments.length) {
throw new SyntaxError("not enough arguments.");
} else if(arguments.length > 1) {
throw new SyntaxError("too many arguments.");
} else if([Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY].indexOf(i) !== -1) {
throw new RangeError("number cannot be \xB1infinity.");
} else if(typeof i === "object" && !(i instanceof RegExp) && !(i instanceof Number) && !(i === null)) {
throw new TypeError("parameter cannot be object/array.");
} else if(i instanceof RegExp) {
throw new TypeError("parameter cannot be RegExp.");
} else if(i == null || i === undefined) {
throw new ReferenceError("parameter is null or undefined.");
} else {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && (i === i);
}
}
console.log(isNumber(Infinity));
console.log(isNumber(this));
console.log(isNumber(/./ig));
console.log(isNumber(null));
检查值是否真的是NaN的更好方法是:
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);
只需将结果转换为String并与'NaN'进行比较。
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
使用此代码:
isNaN('geoff');
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
所以我看到了几个回应,
但我只是用:
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
至于Number类型的值是否测试它是否是NaN
,全局函数isNaN
将完成工作
isNaN(any-Number);
对于适用于JS中所有类型的通用方法,我们可以使用以下任何一种方法:
对于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的一致性,我们也可以使用这个polyfill for 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;
}
请查看This Answer了解更多详情。
NaN是一个特殊值,无法像那样进行测试。我只想分享一个有趣的事情就是这个
var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
alert('nanValue is NaN');
这仅对NaN值返回true,并且是一种安全的测试方法。绝对应该包含在一个函数中或至少被评论过,因为测试相同的变量是否彼此不相等显然没有多大意义,呵呵。
您应该使用全局isNaN(value)
函数调用,因为:
例子:
isNaN('geoff'); // true
isNaN('3'); // false
我希望这能帮到您。
从ES6开始,Object.is(..)
是一个新的实用程序,可用于测试绝对相等的两个值:
var a = 3 / 'bar';
Object.is(a, NaN); // true
要解决'1.2geoff'
被解析的问题,只需使用Number()
解析器。
所以不是这样:
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”的计算机字面解释。
虽然@chiborg的答案是正确的,但还有更多内容需要注意:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
重点是,如果您使用此方法验证输入,结果将相当自由。
所以,是的,你可以使用parseFloat(string)
(或者在全数字parseInt(string, radix)
'的情况下,然后随后用isNaN()
包装,但要注意数字与其他非数字字符交织在一起的问题。