JavaScript NaN和Infinity特殊值 [译]


Posted in Javascript onSeptember 20, 2012

1.NaN

在JavaScript中,NaN代表了“not a number”.主要在解析字符串出现错误时会返回这个值:

> Number("xyz") 
NaNNaN

的名字是“not a number”,不过也可以说是not not a number:

> NaN !== NaN 
true

它是一个数字!类型为"number"
> typeof NaN 
'number'

1.1 检测NaN
JavaScript中,NaN是惟一一个和自己也不想等的值.所以,也就不能使用等号运算符来判断一个值是否是NaN,不过有全局函数isNaN()来干这件事.
> isNaN(NaN) 
true

Kit Cambridge指出isNaN()的一个问题:它会隐式的将它的参数转换成数字,所以即便参数是个不能转换成数字的字符串,它也会返回true(转换成了NaN):

> Number("xyz") 
NaN 
> isNaN("xyz") 
true

由于相同的原因,isNaN对其他很多对象也返回true:

> Number({}) 
NaN 
> isNaN({}) 
true > Number(["xzy"]) 
NaN 
> isNaN(["xzy"]) 
true

重写了valueOf方法的自定义对象同样:
> var obj = { valueOf: function () { return NaN } }; 
> Number(obj) 
NaN 
> isNaN(obj) 
true

所以可以利用NaN是唯一一个满足(x !== x)不等式的值来写一个自己的isNaN函数,这样就不会有上面提到的问题:
function myIsNaN(x) { 
return x !== x; 
}

目前一个修正版的isNaN方法Number.isNaN()已经被添加到了ECMAScript 6中(译者注:Firefox已经实现了).Crockford实现的这个方法,比上面的myIsNaN更容易理解,核心代码是这样的:
Number.isNaN = function (value) { 
return typeof value === 'number' && isNaN(value); 
};

2.Infinity

用0作除数会产生另外一个特殊值Infinity:

> 3/0 
Infinity

你不能想当然的猜测正无穷大或者负无穷大的计算结果:
>Infinity - Infinity 
NaN

比无穷大还大的值仍然是无穷大:
> Infinity + Infinity 
Infinity> 5 * Infinity 
Infinity

3.参考

What is {} + {} in JavaScript?

Javascript 相关文章推荐
HTML Dom与Css控制方法
Oct 25 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
Jan 10 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
Sep 28 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
Jan 18 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 Javascript
了解JavaScript中let语句
May 30 Javascript
JavaScript实现五子棋小游戏
Oct 26 Javascript
JavaScript 更严格的相等 [译]
Sep 20 #Javascript
JavaScript 反科里化 this [译]
Sep 20 #Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 #Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 #Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 #Javascript
javascript分页代码(当前页码居中)
Sep 20 #Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 #Javascript
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
PHP实现的简单缓存类
2015/07/29 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
python实现抽奖小程序
2020/04/15 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
python安装后的目录在哪里
2020/06/21 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
这段代码难道不该打印出56吗
2013/02/27 面试题
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
实习心得体会
2014/01/02 职场文书
在校生自我鉴定
2014/01/23 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
自主招生专家推荐信
2015/03/26 职场文书
特此通知格式
2015/04/27 职场文书
素质拓展训练感想
2015/08/07 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL