为什么NaN不等于NaN

typeof NaN 返回结果为number,NaN的类型为number,所有当NaN == NaN返回false时会给人留下很多疑惑。

NaN是Not a Number,不是一个数值的缩写。一些数学运算会产生不可表达的值,即NaN。 NaN更多的是表示不是一个数值的状态,而不是一个数值的状态有很多种情况。

如果A为NaN,B为NaN,也就是说A不是一个数值,B也不是一个数值。比如‘abc’,‘efg’都不为一个数值,你能说它们相等吗?当然不能。这样来理解NaN == NaN返回false,就更容易理解了。更俗一点的理解:你是人,他是人,你们都不是数值,但你和他能相等么?

判断一个值是不是数值有两种判断方法:

1、全局的isNaN

      全案的isNaN会将一个值试图转换为number(使用Number(value)转换),如果转换的结果为NaN,则返回true,否则返回false。

      一些空字符串、布尔值会经过Number(value)转换为0、1,所有也会返回false。

        Date对象经过Number(value)转换为时间戳number,

isNaN(1)            //false
isNaN('1')          //false
isNaN('')           //false
isNaN('  ')         //false
isNaN(true)         //false
isNaN(null)         //false
isNaN(new Date())   //false
isNaN(undefined)    //true
isNaN(new Object()) //true
isNaN('abc')        //true
isNaN(NaN)          //true

   polyfill对isNaN的实现(更易于理解isNaN的原理):

const isNaN = function(value) {
    const n = Number(value);
    return n !== n;
};

2、Number.isNaN

      Number.isNaN也可用于判断一个值是否为NaN,但该方法不会进行自动的值转换。Number.isNaN是用于判断一个值类型为number,并且为NaN。

isNaN(1)            //false
isNaN('1')          //false
isNaN('')           //false
isNaN('  ')         //false
isNaN(true)         //false
isNaN(null)         //false
isNaN(new Date())   //false
isNaN(undefined)    //false
isNaN(new Object()) //false
isNaN('abc')        //false
isNaN(NaN)          //true

polyfill对Number.isNaN的实现:

Number.isNaN = Number.isNaN || function isNaN(input) {
    return typeof input === 'number' && input !== input;
}

总结:1、要粗略的判断一个value是否为NaN,即是否能通过Number(value)转换为number的,使用全局isNaN进行判断;2、要判断一个value是否就是NaN精确的判断,使用Number.isNaN判断。3、一般情况推荐使用Number.isNaN进行判断,isNaN判断可能会返回意想不到的结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值