js的NaN和isNaN

什么是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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值