isNaN()与Number.isNaN()的区别

1、isNaN()

isNaN函数是用来确定一个值是否是NaN,可以在全局使用,返回值是一个布尔值true或false:

//基础用法
isNaN(1) //false
isNaN(NaN) //true

但是isNaN方法有一些怪异的行为,不然也不会有Number.isNaN函数什么事了:

isNaN(undefined); // true
isNaN({});        // true
isNaN("37,5")     // true
isNaN("123ABC")   // true
isNaN("abc")      // true

可以看到,以上的这些isNaN函数的参数都不是NaN,怎么还返回true呢? MDN的解释是这样的:如果isNaN函数的参数不是Number类型, isNaN函数会首先尝试将这个参数转换为数值,然后才会对转换后的结果是否是NaN进行判断, 也就是说,isNaN的参数首先会执行Number()进行强制转换,然后再去判断是否是NaN:

isNaN(true)       // false 因为Number(true)值为1,而1不是NaN, 所以返回false
isNaN(undefined); // true  因为Number(undefined)值为NaN, 所以返回true
isNaN({});        // true  因为Number({})值为NaN, 所以返回true
isNaN('abc');     // true  因为Number(abc)值为NaN, 所以返回true
isNaN('');        // false 因为Number('')值为0, 所以返回false

2. Number.isNaN()

Number.isNaN() 方法确定传递的值是否为 NaN,并且检查其类型是否为 Number,它的返回值是布尔类型。它是原来的全局 isNaN()的更稳妥的版本(注意:ECMAScript 2015版本才有Number.isNaN())。

也就是说,Number.isNaN函数会先检查参数是不是Number类型,如果不是,直接会返回false,只有参数是Number类型才会去判断是不是NaN,我们用Number.isNaN再验证下之前的例子:

// 基本使用
Number.isNaN(NaN)    // true
Number.isNaN(1)      // false

// 特殊情况
Number.isNaN(true)        // false 因为true不是Number类型
Number.isNaN(undefined)   // false 因为undefined不是Number类型
Number.isNaN({})          // false 因为{}不是Number类型
Number.isNaN("abc")       // false 因为"abc"不是Number类型
Number.isNaN("")          // false 因为""不是Number类型

3. 推荐使用Number.isNaN()

通过上述的几个例子可以看到,Number.isNaN用来判断某个值是否是NaN更像是我们理想型用法,不会产生一些比较怪异的行为,使我们的代码更加的严谨,防止出现bug, 所以在写代码的时候更推荐使用Number.isNaN这个方法来确定一个值是否是NaN。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值