什么是NaN?
对于NaN的定义,这里表达一下个人的理解:由于数学运算的返回结果(或者说其中有操作数不是数字类型导致返回的无效数字),不是一个有效的数字。但是这个结果仍然是数字类型,只是因为执行数学运算没有成功,返回一个失败的结果。
demo:
var a = "str";
var b = 2;
var c = a/b;
console.log(c); // NaN
console.log(typeof c); // number
用上面这个例子,来验证我个人对NaN定义的理解。首先a和b进行除法运算,由于a是字符串类型和数字类型b,这样的情况是无法得到一个有效数字的。所以变量c的值是一个NaN,而c的数据类型却是number。
ps:不要把NaN想象为:不是一个数字(not a number),因为这样仅仅是NaN的“一半”。
如何判断一个变量是不是NaN?
从上面的定义我们已经知道了什么是NaN,那么哪些值是NaN呢?按照上面所说的那样,可以想到NaN首先应该是一个数学运算的结果,而并非一个直接定义的变量或者常量。
对于判断一个变量是否为NaN,可能很多人会想到isNaN这个方法,那我们就来一个demo看看这个方法判断的到底准不准确。还是上面那个demo吧:
var a = "str";
var b = 2;
var c = a/b;
console.log(isNaN(a)); // true
console.log(isNaN(b)); // false
console.log(isNaN(c)); // true
这个例子中,a的结果是true,b是false,c是true。对于isNaN来说,它是判断一个值是不是NaN,如果是则返回true。但是a是一个字符串,并不是一个NaN(因为不符合NaN的条件:不是一个数字且数据类型为number)。但为什么isNaN判断这个变量a的时候还是会返回true呢?这也是一个bug,并且已经存在很久了(据说至今已超过19年)。所以判断一个变量是否为NaN不能使用isNaN()这个方法,下面给大家介绍另外4个方法。
1、根据NaN的定义,判断参数的类型加上isNaN方法。
var a = "str";
var b = 2;
var c = a/b;
function isNaN(n) {
if(typeof n === "number" && isNaN(n)) {
return true;
} else {
return false;
}
}
console.log(Number.isNaN(a)); // false
console.log(Number.isNaN(b)); // false
console.log(Number.isNaN(c)); // true
2、第一个方法的改良,防止在老版本的浏览器不支持isNaN方法。
var a = "str";
var b = 2;
var c = a/b;
if(!Number.isNaN) {
Number.isNaN = function(n) {
return( typeof n === "number" && window.isNaN(n));
}
}
console.log(Number.isNaN(a)); // false
console.log(Number.isNaN(b)); // false
console.log(Number.isNaN(c)); // true
3、利用NaN是唯一一个不等于任何自身的特点。
var a = "str";
var b = 2;
var c = a/b;
function isNaN(n) {
if(n !== n) {
return true;
} else {
return false;
}
}
console.log(isNaN(a)); // false
console.log(isNaN(b)); // false
console.log(isNaN(c)); // true
4、利用ES6中提供的Object.is()方法。
var a = "str";
var b = 2;
var c = a/b;
console.log(Object.is(a, NaN)); // false
console.log(Object.is(b, NaN)); // false
console.log(Object.is(c, NaN)); // true