JavaScript中Number.isNaN 和 isNaN 的区别详解

 更新时间:2023年09月04日 09:44:39   作者:Lvzl  
本文和大家分享一个前几天写代码踩的坑,笔者在业务逻辑中需要对一个值进行NaN的判断,由于笔者的不严谨,使用了isNaN,从而引起Bug,也正是因为这个,笔者才知道了isNaN和Number.isNaN的区别,所以本文就和大家聊聊它们的区别

前言

本文和大家分享一个前几天写代码踩的坑,笔者在业务逻辑中需要对一个值进行 NaN 的判断,由于笔者的不严谨,使用了isNaN,从而引起了Bug,也正是因为这个,笔者才知道了 isNaNNumber.isNaN 的区别,如果你认为这俩没区别,觉得 isNaN 是历史遗留的全局变量,后面又加到 Number 上的话,建议你接着往下看。如果你知道他们的区别,可以划走了。👻

笔者将从以下两个方面来描述这个知识点:

  • 什么是NaN
  • isNaNNumber.isNaN 的区别是什么。

什么是NaN

JS 中的 NaN,是 Not a Number 的缩写,代表一个值 或者 一个表达式的值 不是一个数字。它有以下几个特点:

  • 它是全局作用域中的一个变量。
  • Number.NaNNaN 是同一个东西,有相同的特性,只不过一个是全局变量;一个是 Number 上的属性。但是它俩也不能划等号,毕竟 NaN 自己都不等于自己。
  • NaN 涉及数学运算,通常情况下都会返回 NaN,但是还有例外,看下图:

  • NaN 涉及关系比较(><>=<=)时,都返回false

什么情况下会得到NaN呢?

  • 显式将非 NumBer 类型转为 Number 类型,比如 Number('aaa')
  • 在调用一些需要数字类型参数的 API 时,可能 API 内部会做转换,一旦无法转为数字,可能就返回了 NaN,比如 Math.abs('aaa')
  • 等等......

那在平时开发中,为了保证我们写的代码逻辑运行正常,就可能需要对 NaN 判断,接下来我们就来看下判断 NaN 的两个 API 有啥不同。

isNaN 和 Number.isNaN 的区别

首先,这俩 API 都能够用于判断 NaN,这一点从 API 的名字就能看出,然后各位看图总结不同的地方:

不同点:

  • Number.isNaN 是直接拿参数与 NaN 去比,也就是说,你一定要传 NaN 进去才返回 true。至于怎么比的,咱也不知道,反正不是 ===,因为 NaN 的特性——自己不等于自己。
  • isNaN 会先尝试将参数转换成数字,如果可以转换成数字,则返回 false;否则返回true

咱们不妨来讨论一下,Number.isNaN内部的实现,肯定不是:

Number.isNaN = (target) => target === NaN  // 自己不等于自己

我猜可能是:

// 因为只有传 `NaN` 进去才返回 `true`,而 NaN 是 Number 类型
// 再加上 `NaN + '' === 'NaN'`
// 也许是对的
Number.isNaN = (target) => Object.prototype.toString.call(target) === '[object Number]' && target+'' === 'NaN'

总结

本文主要内容为:

  • NaN 的特性
  • isNaNNumber.isNaN 的区别,一句话总结:Number.isNaN只有传 NaN 进去才返回 trueisNaNNaN 或者不能转化为 Number 的都会返回 true

以后咱们还是不要使用isNaN为好!

以上就是JavaScript中Number.isNaN 和 isNaN 的区别详解的详细内容,更多关于JavaScript Number.isNaN和isNaN区别的资料请关注脚本之家其它相关文章!

相关文章

  • js实现数组的扁平化

    js实现数组的扁平化

    这篇文章主要为大家介绍了js实现数组扁平化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 浅谈JavaScript中内存泄漏的几种情况

    浅谈JavaScript中内存泄漏的几种情况

    本文主要介绍了浅谈JavaScript中内存泄漏的几种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 微信小程序开发之实现别踩白块游戏

    微信小程序开发之实现别踩白块游戏

    这篇文章主要为大家详细介绍了如何通过微信小程序开发一个简单的别踩白块游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以和小编一起学习一下
    2023-02-02
  • 深入php面向对象、模式与实践

    深入php面向对象、模式与实践

    这篇文章主要介绍了深入php面向对象、模式与实践,需要的朋友可以参考下
    2016-02-02
  • js限制input标签中只能输入中文

    js限制input标签中只能输入中文

    这篇文章主要介绍了js限制input标签中只能输入中文的的相关资料,需要的朋友可以参考下
    2015-06-06
  • JS解决Date对象在IOS中的“大坑” 以及时间格式兼容问题

    JS解决Date对象在IOS中的“大坑” 以及时间格式兼容问题

    这篇文章主要介绍了JS解决Date对象在IOS中的“大坑” 以及时间格式兼容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • JavaScript 作用域实例分析

    JavaScript 作用域实例分析

    这篇文章主要介绍了JavaScript 作用域,结合实例形式分析了JavaScript函数作用域相关概念、原理及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • 微信小程序tabBar用法实例详解

    微信小程序tabBar用法实例详解

    这篇文章主要介绍了微信小程序tabBar用法,结合实例形式详细分析了微信小程序中tabBar的功能、配置项使用方法与操作注意事项,并附带完整demo源码供读者下载参考,需要的朋友可以参考下
    2017-12-12
  • js实现坦克移动小游戏

    js实现坦克移动小游戏

    这篇文章主要为大家详细介绍了js实现坦克移动小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 分享javascript计算时间差的示例代码

    分享javascript计算时间差的示例代码

    这篇文章主要为大家介绍了javascript计算时间差的示例代码,,一般来说都是计算当前时间和一个指定时间点之间的差距,感兴趣的小伙伴们可以参考一下
    2016-01-01

最新评论