首页 > 代码库 > javascript数据类型

javascript数据类型

  此文章基于javascript高级程序设计三。

  ECMAScript把数据分为两类:基本数据类型复杂数据类型。基本数据类型(也称简单数据类型)有5种:Undefined、Null、Boolean、Number、String。复杂数据类型只有1种:Object。所以值最终都将是上述6种数据类型之一。

  鉴于ECMAScript为松散类型的,所以需要一种手段来检测给定变量的数据类型--typeof就是提供这方面信息的操作符。typeof是个操作符,所以后面的括号不是必须的。对一个值使用typeof可能返回下列某个字符串:

  • "undefined"--如果这个值没有定义;
  • "boolean"--如果这个值是布尔值;
  • "number"--如果这个值是数值;
  • "string"--如果这个值是字符串;
  • "object"--如果这个值是对象或者是null;请注意typeof null返回的是"object";
  • "function"--如果这个值是函数;  

有人肯定会对这儿的function产生疑问,数据类型中没有function啊!根据高三(javascript高级程序设计三以下统一简称高三)上所诉函数从技术角度在ECMAScript中是对象,不是一直数据类型。然而,函数确实有一些特殊的属性,因此通过typeof操作符来区分它和其他对象是有必要的。

1.Undefined类型

  Undefined类型只有一个值undefined。变量声明却没有初始化的情况下,这个变量的值就是undefined。

2.Null类型

  Null是第二种只有一个值的类型,这个特殊值就是null。从逻辑角度来看,null值表示一个空对象指针,所以typeof检测null时返回"object"。

 undefined值是派生自null值的,所以ECMA-262固定undefined == null返回true,但是===返回false。

3.Boolean类型

 Boolean类型有两个值:true和false.ECMAScript中所以的值都可以调用Boolean()转换成对应Boolean值。下表给出了各种数据类型及其对应的转换规则:

  

      

 理解这些规则对理解if自执行非常重要,比如:

   var msg="hello";

   if(msg){

  alert("msg为非空字符,在if中自动转换成true");

  }

4.Number类型

   Number类型使用IEEE754来表示整数和浮点数值。为支持各种数值类型,ECMA-262定义了不同数值字面量格式,八进制、十进制和十六进制。

   1)浮点数

      ECMA对那些极大和极小的数值用科学计数法表示,例如:

      0.000003 //3e-6          3000000 //3e6

      浮点数最高精度为17位,这儿有个比较有趣的列子:

      0.1+0.2 == 0.3 //false      因为0.3真实值为0.30000000000000004

  2)数值范围

  由于内存限制,ECMAScript并不能保存世界上所以的数值。ECMASscript能表示最小的值保存在Number.MIN_VALUE中,在大多数浏览器中这个值为5e-324;能表示的最大值保存在Number.MAX_VALUE中,在大多数浏览器中这个值为1.7976931348623157e308,如果超过这两个值的就会表示成Infinity(正无穷大)和-Infinity(负无穷大)。

isFinite()可以用来检测一个数值是否是有穷,数值在Number.MIN_VALUE和Number.MAX_VALUE之间返回true。

  3)NaN

  NaN(Not a Number)即非数值是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数没有返回数值的情况(只有就不会抛错了),例如:

  其他语言不允许被除数为0,ECMAScript却可以,任何数值除以0都返回NaN,这样程序可以继续执行。任何涉及NaN的计算都返回NaN。

  NaN == NaN //false    自身不相等

  针对ECMAScript这两大特点,ECMAScript定义了isNaN函数。这个函数接受一个任意参数帮我们确定这个参数不是数值。接受参数后,isNaN会试图把从不是数值的参数转换成数值,如果不能转换成数值则返回true。Boolean、数值型字符、""都能转成数值返回false,其它返回true。

  4)数值转换

  有三个函数可以把非数值转换成数值:Number()、parseInt()、parseFloat()。Number()的参数可以为任何数据类型,后两个只能接受字符串参数。

  Number()的转换规则如下:

  

  由于Number()函数在转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用parseInt()函数

  ⑴如果第一个非空字符不是数值或负号就会返回NaN。

    如:parseInt("abc") //NaN

  ⑵如果第一个非空字符为数值则继续往后解析,直到解析完毕或遇到一个非数值字符
    如:parseInt("123") //123     parseInt("123abc") //123   parseInt("22.5") //22

  ⑶parseInt()也能识别出各种整数格式(八进制、十进制、十六进制)。在ECMAScript3中第一个字符为0会被当成八进制解析,在ECMAScript5中被忽略,如例1;为了避免这种分歧,parseInt ()提供了第二个参数,这样就可以显示的把某个参数转换成对应的整数格式如例2:

    例1:parseInt("070"); //ECMAScript3   56                parseInt("070"); //ECMAScript5   70

    例2:parseInt("070",8)  //ECMAScript3   56              parseInt("070",8)  //ECMAScript5   70

  ⑷第一个为0x被当成十六进制解析。如:

    parseInt("0xAF",16) //175     parseInt("0xAF") //175

  ⑸如果第一个字符不为数值,但parseInt()函数传了第二个参数也能正常解析,如:

    parseInt("AF",16) //175

 

  有时候我们想转换浮点数值,所以parseFloat()函数可以帮我们保留小数。此函数也是从第一个字符开始解析,直到解析完毕或遇到非数值字符。parseInt和parseFloat有两个区别,第一 parseFloat可以解析一个小数点,第二 parseFloat始终忽略前导的零。但是16进制的字符串始终解析为0,由于parseFloat只能解析十进制整数格式,所以没有第二个参数。还需要注意的是 例如:22.0会被解析成整数22。parseFloat能解析科学计数法e,parseInt不能。

  如:  parseFloat(‘3e2‘) //300   parseInt(‘3e2‘)  //3

 5.String类型

  String类型用来表示0个或多个16位Unicode字符组成的序列,即字符串。转换为字符有3种方法:1.toString() 2.String() 3.+""。当不知道变量类型是用方法1转换会报错,因为null和undefined没有toString()。toSting()还能传参(2 、8、 10、 16)

6.Object类型

  ECMASctipt中的对象其实就是一组数据和功能的结合。

  创建方式有两种:1. var obj= new Object(); 2.var obj = {}

 

javascript数据类型