ECMAScript(我们常说的Javascript实际上包含三个部分ECMAScript、DOM、BOM,我们所说的数据类型这块实际由ECMAScript描述)中有五种简单的数据类型,undefined/null/boolean/number/string以及引用类型Object。ECMAScript不支持自定义数据类型,而所有的值都最终将是这六种数据类型之一。
对于熟悉java/c++等面向对象的程序员知道String是一种引用类型,但是在ECMAScript中string却是基本类型,这点要分清楚。
typeof 操作符
由于ECMAScript中是松散类型的,因此需要通过特定的方式来判断变量的数据类型 — 使用 typeof 运算符,对于此操作符返回的值可以为以下字符串
- undefined : 当前值未定义
- boolean : 布尔值
- string : 字符串
- number : 数值
- object : 引用类型
- function : 函数类型
undefined类型
undefined类型只有一个值,就是undefined。当我们使用var来声明一个变量但并没有初始化时或者未声明该变量时,这个变量的值就是undefined,例如 :
var mess;
alert(typeof mess); //undefined
alert(mess == undefined); //true
虽然包含undefined值的变量与未声明的变量都是undefined类型,但是二者还是有不同之处,请看下面的例子:
var mess1;
//未声明的变量mess2
//var mess2;
alert(mess1); //undefined;
alert(typeof mess2); //undefined
alert(mess2); //报错
从上面的例子可以看出,当使用alert()访问未声明的变量mess2时报错了。实际上,对于未声明的变量只能使用typeof来检测其类型。
对于undefined和null两种值大家有时候会分不清楚,实际上undefined是派生自null,所以使用undefined==null返回值为true,但两者用途并不相同,null表示定义的变量是用于将来保存引用类型的值。而undefined并无实际用途。
Boolean类型
Boolean类型表示布尔类型,取值有true和false。实际上ECMAScript中任意类型的值才能转换成Boolean类型,可以通过Boolean()函数将任意值转换成Boolean类型,具体的转换规则如下表:
数据类型 | 结果为true | 结果为false |
---|---|---|
Boolean | true | false |
String | 非空字符串 | “” |
Number | 非零非NaN | 零和NaN |
Object | 任意对象 | null |
undefined | na | undefined |
Number类型
与其它编程语言不同的是,Number类型既可以表示整型数,也可以表示浮点数
整数
对于整数,可以使用十进制(默认)以及八进制、十六进制表示,其中八进制必须以[0]开头,十六进制则以[0x]开头。对于八进制,如果某一位超过八进制表示范围,则数值会被当作十进制解析,如下
var a = 33; //33
var b = 033; //27
var c = 099; //99
var d = 0x33; //51
浮点数
浮点数即数值中必须包含小数点以及小数点后面必须有数字。由于保存浮点数所需空间为整数两倍,所以对于小数点后面没有数字或者只有零的情况下,此数据会被当作整数保存的。另外,对外极大或者极小值可以使用科学计数法表示(使用e或者E)。默认情况下,对于小数点后面有连续6个以上的零的浮点数会自动转换成科学计数法,如:
var num = 0.0000003; //3e-7
由于计算机底层使用二进制来处理数据,而浮点数无法使用二进制准确表示,所以对浮点数进行算术运算时可以存在精度不准确问题,如:
var a = 0.1;
var b = 0.2;
var c = a + b; //0.30000000000000004
在上面的例子中可以看到0.1 + 0.2得到的结果并不是预期的0.3,这种问题并不是ECMAScript特有的,其它编程语言也存在这种情况。
数值范围
ECMAScript能够表示的最大值与最小值使用Number.MAX_VALUE以及Number.MIN_VALUE表示,如果数值超出了Number能表示的范围,则会被自动转换成Number.POSITIVE_INFINITY或Number.NEGATIVE_INFINITY。
NaN
NaN表示非数值,是一个特殊的值,它表示本应该返回数值的操作结果未返回正确的数值的情况,比如除以0,在其它编程语言中会报错而在ECMAScript中则返回NaN而程序不会出错。
NaN有两个特点:(1)任何涉及NaN的操作都会返回NaN,(2)NaN与任何值都不相等包括自身。针对这种特点,ECMAScript定义了isNaN()函数来判断该值能否转换成数值
数值转换
ECMAScript中提供了三个函数用于将数据转换成数值,分别是Number()、parseInt()、parseFloat()。第一个函数可以用于任意类型,而后面两种方法则专门针对字符串转换成数值。
Number()函数的转换规则如下:
- 如果是Boolean类型,true和false将分别转化成1和0
- 如果是null则转换成0
- 如果是undefined则转换成NaN
- 如果是字符串,则比较复杂,有如下情况
- 如果只包含数字,则转换成十进制数值
- 如果包含有效十六进制格式,则转换成十六进制数值
- 空字符串则转换成0
- 如果包含除上述之外其它字符则转换成NaN
下面看几个例子:
var num1 = Number("22"); //22 var num2 = Number("022"); //22 var a; var num3 = Number(a); //NaN var num4 = Number("0x33"); //51 var num5 = Number(false); //0 var num6 = Number(""); //0 var num7 = Number("s333)"; //NaN
由于Number函数在处理时比较复杂,因此常用的都是parseInt以及parseFloat两个函数。
parseInt
parseInt用于将字符串转换成数值,规则如下:从字符串找到首个非空字符,如果不是数字符号或数字,则返回NaN;如果首个非空字符是数字符号或数字则继续解析直到结束或者一个非数字字符,而且此函数能够解析八进制以及十六进制,下面看几个示例
var num1 = parseInt("123"); //123
var num2 = parseInt(""); //NaN
var num3 = parseInt("0x22"); //34
var num4 = parseInt("022"); //22或者18
var num5 = parseInt("22.5"); //22
var num6 = parseInt("123hello"); //123
另外,parseInt还可以接受第二个参数:转换时使用的进制,这样可以消除进制带来的一个疑惑或避免错误解析,一般推荐使用此方式,如下面:
var num1 = parseInt("22"); //22
var num2 = parseInt("22",8); //18
var num3 = parseInt("ff"); //NaN
var num4 = parseInt("ff",16); //255
- parseFloat
,parseFloat解析规则与parseInt类似,但有一点不同,parseFloat只能解析十进制,即忽略八进制的前导零,十六进制转换成0.
String类型
与其它面向对象编程语言不同,String类型在ECMAScript属于基本类型,表示零或多个unicode字符组成的序列,可以使用单引号或者双引号包含起来,通过length属性可以获取字符串长度。
转换成字符串
如果要把一个值转换成字符串有两种方式:一是使用每个值都有的toString()方法,一种是使用String()方法。
- toString方法
数值、布尔、对象、字符串都有toString方法用于转换成字符串(除了null和undefined以外),一般情况下不用传递参数,但toString方法也可以传递一个参数:转换使用的进制;当将数值转换成字符串时默认使用的是十进制,与parseInt不同的是,toString可以接收二进制,使用不同的基数得到的结束也是不同的,请看下面的示例:
var num = 11;
alert(num.toString()); //11
alert(num.toString("2")); //1011
alert(num.toString("8")); //13
alert(num.toString("16")); //b
- String() 方法
对于null值或undefined值在调用toString()方法时会报错,而使用String方法则可以避免这种情况,它能够将任意类型转换成字符串,它的规则如下:
- 如果为null,则返回”null”
- 如果为undefined,则返回”undefined”
- 都不是的话则调用toString()方法转换