例子

大家先看一看下面这个例子,

isNaN(NaN);

isNaN('A String');

isNaN(undefined);

isNaN({});

Number.isNaN(NaN);

Number.isNaN('A String');

Number.isNaN(undefined);

Number.isNaN({});

如果你能很清楚答案,那么这篇文章你可以略过。

不清楚的朋友,我们来慢慢来分析。

答案如下:

isNaN(NaN); // true

isNaN('A String'); // true

isNaN(undefined); // true

isNaN({}); // true

Number.isNaN(NaN); // true

Number.isNaN('A String'); // false

Number.isNaN(undefined); // false

Number.isNaN({}); // false

为什么看起来同样的函数,得出的结果为什么不同呢?

NaN 是什么?

在解释 NaN 之前,我想先解释下 type/value/variable 这个几个容易混淆的概念,已经很清楚的朋友可以跳过这一小节

type / value / variable 是什么

在 JavaScript 中,value一共有七种type

null

undefined

boolean

number

string

object

symbol (ES6新增)

那么,variable是什么呢?就是我们平时 var 之后的声明的那个东西。

type, value, variable 之间的关系可以这么说:variable是存放value的容器,而value是有着type概念的,但是容器variable是没有type的概念的,举个例子

var a = 'foo';

容器 variable a 装着 value 'foo', value 'foo' 的type是string

NaN

MDN里面这么描述

The global NaN property is a value representing Not-A-Number.

意思是是说:NaN是一个放在 global(浏览器里是window)对象里的一个value,是一个代表Not-A-Number的value.

意思还是很含糊。

那么我们在看神书《You Don't Know JS》里的描述

NaN literally stands for "not a number", though this label/description is very poor and misleading, It would be much more accurate to think of NaN as being "invalid number," "failed number," or even "bad number," than to think of it as "not a number."

根据上一个小结的知识,我们知道了,NaN是一个 value, 这个 value 的 type 是 number。

但是跟普通的type是number的value不一样的是,NaN 代表 'Not a number' 这一意义。

那么问题来了,怎么判断一个 value 是不是 NaN 呢?

isNaN()

也许有人会说,判断还不容易吗?直接比较不就好了。

NaN === NaN // false

NaN 跟它自己比较会返回false。

所以,我们就需要一个特殊的函数来判断一个value是不是NaN了。

isNaN() 就横空出世了。

我们再回头看一看上面的例子

isNaN(NaN); // true

OK, 成功了,看似很完美,但是接着看以下例子

isNaN('A String'); // true

isNaN(undefined); // true

isNaN({}); // true

会发现,很明显不是 NaN 的 value 也被误判成 NaN 了。

这个BUG已经存在了20年,从JavaScript最开始就一直存在。很明显当初的设计者,在设计isNaN()的时候,局限了在 "Not a Number" 这一字面意思上了:只要不是number就会返回 true。

于是 ES6 为了弥补这一BUG(而不是修正,因为isNaN存在时间太长,有可能很多功能都是基于这个BUG之上的)引入了 Number.isNaN().

Number.isNaN(NaN); // true

Number.isNaN('A String'); // false

Number.isNaN(undefined); // false

Number.isNaN({}); // false

回头看上面的例子,就明白了修复了什么问题。

Number.isNaN() 的 polyfill

没有ES6的情况下,可以采用以下polyfill

if (!Number.isNaN) {

Number.isNaN = function(n) {

return (

typeof n === "number" &&

window.isNaN( n )

);

};

}

简单来看,就是在原有 isNaN() 的基础上增加了一个 type 的判断,因为 NaN 的 type 是 number。

还有一种更加简单的实现

if (!Number.isNaN) {

Number.isNaN = function(n) {

return n !== n;

};

}

利用了只有 NaN 不跟自己相等的特性。

顺便吐槽一下MDN的解释,他是这么解释 isNaN() 的

You could think of isNaN as:

var isNaN = function(value) {

return Number.isNaN(Number(value));

}

他是在ES6新函数Number.isNaN()的基础上,去解释旧函数isNaN()的。

不过我们可以通过以上方式来解释判断 isNaN() 为什么会出现

isNaN('A String'); // true

isNaN(undefined); // true

isNaN({}); // true

这样的情况了。

isnan java_从 Number.isNaN 与 isNaN 的区别说起 例子相关推荐

  1. NaN是什么? isNaN()/Number.NaN

    1.NaN是什么? NaN(Not a Number),是number数值类型的一类值,表示未定义或不可表示的值. 2.NaN是如何产生的? 它是在执行算术运算时,产生的一种结果:对不同数据类型进行算 ...

  2. 小程序中输入框input的type属性 text、number、idcard、digit 区别

    微信小程序的 input 有个属性叫 type,这个 type 有几个可选值: text:不必解释 number:数字键盘(无小数点) idcard:数字键盘(无小数点.有个 X 键) digit:数 ...

  3. 微信小程序 input 的 type属性 text、number、idcard、digit 区别

    微信小程序的 input 有个属性叫 type,这个 type 有几个可选值: text:不必解释 number:数字键盘(无小数点) idcard:数字键盘(无小数点.有个 X 键) digit:数 ...

  4. type=number和type=tel的区别

    众所周知,HTML5加入了新的input类型 number,这是方便数量输入的.如果是在移动端中,属性type="number"和type="tel"会唤起系统 ...

  5. class instance java_[Java] Java instanceof 和 Class.isInstance()区别与应用

    一.instanceof 关键字 instanceof 关键字用于判断某个实例是否是某个类的实例化对象,形如: String.class instanceofClass"test" ...

  6. 前端深度学习笔记最全

    本站点无更新 最全内容链接:https://www.yuque.com/liyang-qjg8h/ogb65t 一.JS发展历史.ECMA简介.变量.值 1.JavaScript 发展史 1.1. 主 ...

  7. js中isNaN、Number.isNaN,isFinite、Number.isFinite的区别

    判断是否是NaN的方法isNaN 全局作用域中,有个方法,叫isNaN,在判断数据的时候,会将数据做类型转换(可以判断字符串,布尔值等类型) ES6为了纠正数据类型转换的问题,提供了Number.is ...

  8. ES6-11数值扩展:二进制和八进制、数值分隔符、Number.isFinite()、Number.isNaN()等

    1. 二进制和八进制 用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 // true// 非严格模式 (function ...

  9. js中isNaN和Number.isNaN的区别

    背景 与 JavaScript 中其他的值不同,NaN不能通过相等操作符(== 和 ===)来判断 ,因为 NaN == NaN 和 NaN === NaN 都会返回 false. 因此,isNaN ...

最新文章

  1. python装饰器作用-如何理解Python装饰器?
  2. 微服务系列实践 .NET CORE
  3. PHP复杂度,php 常用算法和时间复杂度
  4. 百度鹰眼Web服务API开发使用教程
  5. Android工程中追踪修改bug的总结
  6. iOS 7.1下itms-services在线安装失败的解决方法
  7. Data Binding 实践
  8. 文件怎么更新_iOS屏蔽更新描述文件以及超级详细安装方法分享
  9. OpenCV入门教程
  10. 如何快速深入理解监控知识? | 技术干货
  11. matlab2010 simulink,张德丰 (2010) MATLAB/Simulink建模与仿真实例精讲. 机械工业出版社, 北京....
  12. python 进化树_物种进化树构建
  13. 一哥答疑,如何面对繁杂的数据需求?
  14. Java_167_Thread_线程安全synchronized_模拟选座_List「Integer」
  15. [PHP]PHP爬虫 - URP教务
  16. 如何避免扫码枪重复扫码
  17. spark系列-应用篇之通过livy提交Spark任务
  18. 关于新加坡IT薪酬和找工作网站
  19. 信号处理琐碎知识点 — OFDM 正交频分复用
  20. RCC APB2PeriphClockCmd RCC APB1PeriphClockCmd

热门文章

  1. Dual-Path Fusion:遥感融合
  2. 哈工大机器学习复习笔记(四)
  3. SnnGrow快讯:微软 Win7/8.1 今日结束支持,不会再获得安全更新、AI工程化进程加速,人工智能需要怎样的数据?
  4. 久等了~史上最全爬虫采集场景终于来了
  5. 查找购买绿驹电动车配件联系方式(半小时获取)
  6. Mac 下eclipse 快捷键
  7. linux无缝拼接文件,在Makefile中无缝连接字符串
  8. 用友U8年度帐结转解析
  9. Vue项目 课程列表页 跳转 课程详情页 跳转 视频播放页
  10. 南方科技大学计算机2020考研,南方科技大学电子与电气工程系2020年硕士研究生预调剂通知...