初读JS中Infinity、NaN、undefined、null

首先要确定的是,js有number、string、boolean、Null、undefined和混合Object这六种数据类型。

数值型理解要点(对于Infinity、NaN):

对于数值型number来说。 js中只有这个单一的数字类型。它在内部表示为64位的浮点数(大部分浮点数只能近似地表达小数点以后的部分)。和java的double型一样。所以1和1.0是相同的值。那么算的话便是浮点数运算了,所以运行效率便有所下降,并且js也不是计算语言合适的选择。

那么说到数值型就要说这两个值Infinity、NaN了:

首先要理解这两个值出自于哪里,是做什么用的?


其中Infinity和NaN均出自于js中全局对象,为全局属性(也可以作为全局变量,但只可读)。而 js对这两个值定义是:Infinity是存放“表示正无穷大的数值”NaN是代表非数字的特殊值,用于指示某个值不是数字。

举个例子:数值运算中js的整数型运算,但实际上还是浮点数运算。比如对0做除法不会出错,会得到Infinity(即返回无穷大),其中0除0是没有意义的,比如像无穷大除以无穷大,给负数做开方运算,均是没有意义的,像这种情况的都返回NaN。


ps:需要说明的是,js以 NaN的形式来输出Number.NaN,并且,NaN由于是特殊值,它与其他数值的比较总是不相等的,而只能用isNaN( )函数来比较。

知道了这么多,对于大部分Infinity、NaN的问题就可以解释了:

1.typeof(NaN) ,typeof(Infinity)   // 两个都输出number
2.NaN == NaN                       // false
3.NaN != NaN                       // true ,这个以命题来解释,NaN的确不能与它自身比较,即不相等
4.NaN >= NaN                       // false ,比较无意义 
5."123abc" - 0                     // NaN ,"123abc"强制转换结果是NaN
6.Infinity > 10                    // true ,无穷大
7.Infinity == NaN                  // false

那对于undefined和Null

首先来看下这两个值定义及出处:

  • undefined是undefined型中的属性,返回一个初始值,表示未定义或者对象属性不存在。浅理解为就是缺少一个值。

  • 而Null有几种身份,首先其表示为一种数据类型,且只有一个值:Null;其次它是关键字,即不能用作函数名和变量名;所以其用作null的变量表示“无值、无对象”。在逻辑角度上讲,null值表现为一个空对象指针。

    我们看一下例子:

    typeof null;   // Object(bug)
    typeof undefined;    // Undefined
    Object.prototype.toString.call(null);   //Null
    null == underfined  //true

从数值运算来说,它们两做布尔运算或判断时值都是相等的——false。
而不同点就是首先类型不同,null是字面量,不可更改,在js中期望引入一个对象,相当于空引用指针。而undefined作为undefined的一个属性,就是表示该变量或对象属性没有赋值。