JavaScript中有5种简单数据类型:Undefined、Null、Boolean、Number和String,还有一种复杂数据类型----Object.
typeof操作符
用typeof操作符可以测定给定变量的数据类型,可能会返回下列某个字符串:
undefined----变量未定义或未赋值
boolean------布尔值
string--------字符串
number------数值
object-------对象或null
function-----函数(函数是对象而不是数据类型,但函数有一些特殊属性,因此作区分)
typeof操作符的操作数可以是变量,也可以是常量如34,typeof是一个操作符而不是函数,因此其后面可以加括号也可以不加。
Undefined类型
Undefined类型只有一个值,即特殊的undefined,使用var声明变量但未对其初始化时,这个就是的值就是undefined,不用把一个变量显示初始化为undefined。对于未声明的变量,如果用typeof查看其类型的话也是undefined,但声明未赋值的变量跟未声明的变量不一样,如用alert输出的话未声明的变量会产生错误,对未声明的变量只能执行typeof操作。
Null类型
Null类型同Undefined类型一样,只有一个值,为null,从逻辑角度看,null表示一个空对象指针,所以用typeof检测其类型会返回object。
undefined值派生自null值,因此null与undefined之间的相等操作符(==)返回true。但因其类型不一样,全等操作符(===)返回false。
Boolean
布尔类型只有两个值:true和false。区分大小写。
可以通过调用Boolean()函数把一个值转换为其对应的Boolean值。转换规则为:
如果值为String类型,非空字符串转换为true,空字符串转换为false。
如果值为Number类型,非零值转换为true,0和NaN转换为false。
如果值为Object类型,非null值转换为true,null转换为false。
如果值为Undefined类型,则转换为false。
当要作if条件测试时,会自动执行Boolean转换。
Number类型
Number类型默认为十进制,可以通过加前导0表示八进制,前导0x表示十六进制。
数值可以用八进制或二六进制表示,但在进行算术计算时,都会被转换成十进制值。
对于浮点值,如果整数部分为0,0可以省略。如0.1可以写作.1,但为清晰起见,最好写。如果小数部分为空或是0,则会被转换成整数。当小数位数过多时可以用e表示法,即前面是一个数,中间是e或E,后面接10的幂,如3.1e5表示310000,默认当小数点后面带有6个零及以上时会自动转换为e表示法。
Number.MIN_VALUE表示能表示的最小值。
Number.MAX_VALUE表示能表示的最大值。
如果值超出JavaScript数值范围,则会被自动转换成Infinity或-Infinity(负无穷),可以用isFinite表示一个数是不是有穷的。
NaN表示非数值(Not a Number),用于表示一个本来要返回数值的操作未返回数值的情况(可以防止抛出错误)。任何涉及NaN的操作都返回NaN,NaN与任何值都不相等,包括NaN本身,NaN==NaN返回false。isNaN函数尝试将传入的值转换为数字,如果转换不成功则返回true,否则返回fase。isNaN()也适用于对象,会调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果valueOf()方法未定义则调用toString()方法,(这是ECMAScript中内置函数和操作符的一般执行流程)。
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
Number()函数转换规则:
若为Boolean值,true转换为1,false转换为0;
若为null转换为0;
若为undeined转换为NaN;
若为字符串,按如下规则:
若只包含数字,则转换为对应的十进制数字,能识别十六进制,如”0x11”会被转换为17,但不识别八进制,会忽略前导0,如”011”会被转换为11;
若只包含有效的浮点格式,则将其转换成相应的浮点值(忽略前导0);
如果只包含有效的十六进制格式,则将其转换成相同大小的十进制整数;
空字符串转换为0;
若包含除上述格式之外的字符,则转换为NaN。
若为对象,则调用对象的valueOf()然后依照前面的规则进行转换,如果valueOf()方法未定义(即其实现是继承自object的默认实现),则调用对象的toString()方法再依照前面的规则转换。
parseInt()函数转换规则:
parseInt()函数在执行转换时会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字或负号,会返回NaN(转换空字符串返回NaN,Number()函数返回0);如果第一个字符是数字字符,则继续解析后续字符直到解析完毕所有后续字符或遇到了一个数字字符,如”3434dfdf”会被转换成3434,parseInt()可以识别八进制和二六进制,如parseInt(“070”)返回56,parseInt(“0xf”)返回15。
可以为parseInt()函数加第二个参数表示转换基于的基数,如parseInt(“10”,2)会转换成2,默认为10。
parseFloat()函数转换规则:
类似parseInt()函数,解析至遇到无效字符(第一个小数点有效,第二个小数点无效),如果字符串包含的是可解析为整数的数,parseFloat()会返回一个整数;parseFloat()不解析八进制,会忽略前导0;对于十六进制数始终返回0。
String类型
字符串类型是不可变的,更改变量保存的字符串时会销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
除null和undefined外,每个值都有一个toString()方法,可以调用值的toString()方法返回一个值的字符串表示。默认情况下对于数值格式会返回其十进制表示,但可以通过传递基数参数输出其他进制表示,如var num=10;alert(num.toString(2));返回”1010”。
String()函数也可以把值转换为字符串,其转换规则是:
如果值有toString方法,则调用其toString()方法;
如果值是null,返回”null”;
如果值是undefined,返回”undefined”。
String()函数只能返回数值的十进制表示。
Object类型
通过执行new操作符后跟一函数名称来创建对象,此时此函数是构造函数,创建一个Object类型的实例并为其添加属性和方法,就可以创建自定义对象,对于不给构造函数传递参数的情况下可以省略函数后的括号。Object类型是所有其他对象的基础,Object类型具有的属性和方法也存在于其他更具体的对象中,每个对象的实例都具有下列属性和方法:
constructor----保存创建当前对象的函数;
hasOwnProperty(propertyName) ----检查给定的属性是否在当前对象的实例中(不是在原型中);
isPrototyoeOf(object) ----检查一个对象是否是object的原型;
propertyIsEnumerable(propertyName) ----检查给定的属性是否能用for-in语句枚举;
toString()----返回对象的字符串表示;
valueOf()----返回对象的字符串、数值或布尔值表示。
网上见到的一个测试题
2 // number
3 alert( typeof (Infinity));
4 // number
5 alert( typeof ( null ));
6 // object
7 alert( typeof (undefined));
8 // undefined
9 alert(NaN == NaN);
10 // false
11 alert(NaN != NaN);
12 // true
13 alert(NaN > NaN);
14 // false
15 alert( null == undefined);
16 // true,undefined extends null
17 alert( null >= undefined);
18 // false
19 alert( null <= undefined);
20 // false
21 alert( null == null );
22 // true
23 alert( null != null );
24 // false
25 alert( null != NaN);
26 // true
27 alert( null == NaN);
28 // false
29 alert(NaN == undefined);
30 // false
31 alert(parseInt( " 123abc " ));
32 // 123
33 alert( " 123abc " - 0 );
34 // NaN
35 alert(Infinity > 10 );
36 // true
37 alert(Infinity > " abc " );
38 // false
39 alert(Infinity == NaN);
40 // false
41 alert( true == 1 );
42 // true
43 alert( new String( " abc " ) == " abc " );
44 // true
45 alert( new String( " abc " ) === " abc " );
46 // false
47
48 function step(a){
49
50 return function (x){
51
52 return x + a ++ ;
53
54 }
55
56 }
57
58 var a = step( 10 );
59
60 var b = step( 20 );
61
62 alert(a( 10 ));
63 // 20
64 alert(b( 20 ));
65 // 40
66 var a = " 123abc " ;
67
68 alert( typeof (a ++ ));
69 // number
70 alert(a);
71 // NaN