JavaScript NaN和Infinity特殊值 [译]_javascript技巧

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?

时间: 2024-09-15 17:34:41

JavaScript NaN和Infinity特殊值 [译]_javascript技巧的相关文章

JavaScript 反科里化 this [译]_javascript技巧

本文主要讲了JavaScript中科里化和反科里化this的方法.话题来自于Brendan Eich(JavaScript之父)的一个tweet. 1.反科里化(Uncurrying)this 反科里化this的意思是:把一个签名如下的方法: obj.foo(arg1, arg2)转换成另外一个签名如下的函数: foo(obj, arg1, arg2)想要知道这么做有什么用,我们首先得了解一下通用方法. 2.通用方法(Generic methods) 通常情况下,某个特定的方法只能在某种特定类型

JavaScript 参数中的数组展开 [译]_javascript技巧

译者注:本文要讲的是ECMAScript 6中的知识点,如果你连ES5都不了解的话.我得说,你已经很落后了.CSS4,HTML6,甚至ES7 ES8都已经开始规划了,赶紧形动起来吧,否则淘汰! 有些时候,我们需要把一个数组展开成多个元素,然后把这些元素作为函数调用的参数.JavaScript中可以使用Function.prototype.apply来实现这种展开操作,但它不能被应用在执行构造函数的情况下.本文解释了什么是展开操作以及如何在使用new运算符的同时进行展开操作. 1.展开(Sprea

javascript URL锚点取值方法_javascript技巧

location.href='ping.html#chen=陈建平' 取锚点值 location.hash 结果是:#chen=陈建平 location.href='ping.html?chen=陈建平' 取?后面的值 location.href.search() 结果是:?chen=陈建平 再用substring(1) 就可以取#或?后的值了,再用split()方法可以把多个参数放入数据中 var args=xx.split('&')

javascript 处理null及null值示例_javascript技巧

复制代码 代码如下: function dealNull(obj){ for(var i in obj){ if(null == obj[i] || 'null' == obj[i]){ obj[i]=''; }else if('object' == typeof obj[i]){ dealNull(obj[i]); } } }; // 测试的对象 var a={}; a.aa=null; a.bb='null'; a.c=1; a.b={}; a.b.aaa=null; a.b.bbb='nu

JavaScript 更严格的相等 [译]_javascript技巧

1.检测NaN 在数学上,任意值x总是与自己相等: x = x 但这条规则并不适用于 === 和 NaN: 复制代码 代码如下: > NaN === NaN false 导致的结果就是,你不能通过使用indexOf方法在一个包含了NaN的数组中找到这个NaN,因为该方法在内部是使用了===来判断一个元素是否和参数中指定的值相等的: 复制代码 代码如下: > [ NaN ].indexOf(NaN) -1 译者注:switch语句同理 复制代码 代码如下: switch (NaN) { case

悟透JavaScript整理版第1/2页_javascript技巧

数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个世界.    你看,数据代码间的关系与物质能量间的关系有着惊人的相似.数据也是有惯性的,如果没有代码来施加外力,她总保持自己原来的状态.而代码就象能量,他存在的唯一目的,就是要努力改变数据原来的状态.在代码改变数据的同时,也会因为数据的抗拒而反过来影响或改变代码原有的趋势.甚至在某些情况下,数据可以转变为代码,而代码却又有可能被转变为数据,或许还存在一个类似E=MC2形式的数码转换方程呢.然而,就是在数据和代码间这种即矛盾

每天一篇javascript学习小结(基础知识)_javascript技巧

1.字符转换 var s1 = "01"; var s2 = "1.1"; var s3 = "z";//字母'z'无法转换为数字,所以或返回NaN var b = false; var f = 1.1; var o = { valueOf: function() { return -1; } }; s1 = -s1; //value becomes numeric -1 s2 = -s2; //value becomes numeric -1.

JavaScript中的字符串操作详解_javascript技巧

一.概述    字符串在JavaScript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更 多....JavaScript的核心部分提供了一组属性和方法用于通用的字符串操作,如分割字符串,改变字符串的大小写,操作子字符串等.    当前的大部分浏览器也能从强大的正则表达式获益,因为它极大地简化了大量的字符串操作任务,不过它也需要你克服一条有些陡峭的学习曲线.在这里,主要是介绍字符串本身的一些操作,正则表达式会在以后的随笔中涉及. 二

javascript判断firebug是否开启的方法_javascript技巧

本文实例讲述了javascript判断firebug是否开启的方法.分享给大家供大家参考,具体如下: 经常用Firefox + Firebug调试JavaScript的朋友都知道,一但开启firebug,页面js的运行将显著变慢. 页面的javascript是否能够主动判断当前Firebug是否已开启呢? 答案是肯定的. Firebug已经更新了很多个版本了.印象中某个旧版本可以通过检测console.firebug来判断,不过现在已经无效了. 最近几个版本的firebug可以通过console