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 相关文章推荐
js 巧妙去除数组中的重复项
Jan 25 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
jquery ui resizable bug解决方法
Oct 26 Javascript
Js实现滚动变色的文字效果
Jun 16 Javascript
jqGrid表格应用之新增与删除数据附源码下载
Dec 02 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
jQuery中ajax错误调试分析
Dec 01 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
小程序实现悬浮搜索框
Jul 12 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
解析php类的注册与自动加载
2013/07/05 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
解决python线程卡死的问题
2019/02/18 Python
Python地图绘制实操详解
2019/03/04 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
2020/03/14 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
小学清明节活动方案
2014/03/08 职场文书
追悼会答谢词
2015/01/05 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
Golang获取List列表元素的四种方式
2022/04/20 Golang