Javascript的数据类型分为基本类型(也可以叫值类型)和引用类型。
基本类型是值访问的,在程序中可以直接操作;基本类型包括5种数据格式:Undefined、Null、Bollean、Number和String。例如:
1 var test1=1;//Number
2 var test2="str";//String
3 var test3=true;//Bollean
4 var test4=null;//Null
5 var test5;//Undefined
引用类型是保存在内存中的对象,它们的基类都是Object;在实际操作中我们不能直接访问到它在内存中的位置,操作的是它的引用,它主要分Function、Array、Math、Date和自定义创建的Object对象等。
Object类型
Object类型是JavaScript中使用最多的一种类型。虽然Object的实例不具备多少功能,但对于在应用程序中存储和传输数据而言,它确实是非常理想的选择。
创建Object类型有两种方法:第一种是使用构造函数的方式创建(即new关键字)
1 var obj=new Object();//这里可以胜率圆括号,但是不推荐这么做
2 obj.name="Evan"; 3 obj.age=26;
另一种是使用对象字面量的方式创建
1 var obj={};//与new Object();等价 2 obj.name="Evan"; 3 obj.age=26;
对象字面量创建还可以这样表示
1 varo obj={ 2 "name":"Evan",//属性也可以用字符串表示 3 "age":26, 4 1:true//可以使用数值表示属性,但是会自动转化成字符串 5 }
这两种创建Object类型的的效果是等价的,当时我们一般会选择第二种:因为对象字面量创建的时候代码量更少,不需要调用构造函数,而且给人封装的感觉;实际上对象字面量也是向函数传递大量可选参数的首选方式。
Function类型
Function也叫函数、方法。创建函数的方式有两种:
函数声明的方式,这也是常用的方式。
1 function fun(){....}
变量定义的方式。
1 var fun=function(){}
虽然这两种创建函数的方式功能是一样的,但是实际上它们还是有区分的:在预编译的时候,声明的方式会直接给函数分配内存空间,在执行的时候就可以调用了;而定义的方式会吧fun当成变量存起来,在预编译的时候不会赋值,所以在执行的时候会出现未定义的情况。
1 var a = 1; 2 3 console.log(add_1(a)) 4 5 function add_1(num) {//直接声明 6 return num + 1; 7 } 8 9 console.log(add_2(a)) 10 11 var add_2 = function (num) {//变量定义 12 return num + 1; 13 }
会出现如下结果
所以在创建函数的时候,还是推荐使用第一种方式。
Array类型
数组是Javascript中最常用的类型之一;与其它编程语言中的数组最大的区别是,Javascript中的数组的每一项都可以保存不同类型的数据,也就是说,可以在数组的第一项保存数值,第二项可以保存字符串,第三项可以保存对象...
创建数组的的基本方式有两种:第一种是利用构造函数创建,例如下面的代码所示。
1 var arr=new Array();
也可以预先规定数组的长度
1 var arr=new Array(4);
如果预先知道了数组应该包含的项,也可以这样创建
1 var arr=new Array(“Jone”,"Bruce","Ken","Danny");
在Javascript中,我们还可以省略new关键字
1 var arr=new Array(4) 2 var arr2=new Array(“Evan”)
第二种创建数组的方式是直接用字面量而不用构造函数的方式:
1 var arr=["Jone","Bruce","Ken","Danny"]
尽量不要在数组最后一项加逗号,因为兼容性的原因,不同浏览器的处理方式不一样。
1 var arr=["King","Steven",]//在ie8及之前的版本中,会创建一个包含三项的数组,最后一项是Undefined。在其它的浏览器就会省略最后一个逗号。
数组的访问:数组可以直接用下标的方式进行访问
1 var arr=["Jone","Bruce","Ken","Danny"] 2 alert(arr[1])//Bruce
Javascript中的数组长度是可以自适应的,即使你在定义的时候已经规定它的长度。
Date类型
JavaScript中的Date类型是在早期Java中的java.util.Date类基础上构建的。为此,Date类型使用自UTC 1970年1月1日零时开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的 285 616年。
要创建一个日期对象,使用new操作符和Date构造函数即可。
var now = new Date();
在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间。如果想根据特定的日期和时间创建日期对象,必须传入表示该 日期的毫秒数。为了简化这一计算过程,JavaScript提供了两个方法:Date.parse()和Date.UTC()。
其中,Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。JavaScript没有定 义Date.parse()应该支持哪种格式,因此这个方法的行为因实现而异,而且通常是因地区而异。将地区设置为美国的浏览器通常都接受下列日期格式:
● "月/日/年",如:6/13/2204
● "英文月名 日,年",如:January 12,2004
● "英文星期几 英文月名 日 年 时:分:秒 时区",如:Tue May 25 2004 00:00:00 GMT-0700
例如,要为2004年5月25日创建一个日期对象,可以使用下面的代码:
var someDate = new Date(Date.parse("May 25 , 2004"));
如果传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN。实际上,如果直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse()。换句话说,下面的代码与前面的例子是等价的:
var someDate = new Date(‘May 25 , 2004‘);
Date.UTC()方法同样也返回表示日期的毫秒数,但它与Date.parse()在构建值时使用不同的信息。Date.UTC()的参数 分别是年份、基于0的月份(一月是0,二月是1,以此类推)。月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数。在这些参数中,只有前 两个参数(年和月)是必需的。如果没有提供月中的天数,则假设天数为1;如果省略其他参数,则统统假设为0。
var y2k = new Date(Date.UTC(2000, 0));//GMT时间2000年1月1日零时 var allFives = new Date(Date.UTC(2005,4,5,17,55,55));//GMT时间2005年5月5日下午5:55:55
如同模仿Date.parse()一样,Date构造函数也会模仿Date.UTC(),但有一点明显不同:日期和时间都基于本地时区而非GMT来创建的。可以将前面的例子重写如下:
var y2k = new Date(2000,0); //本地时间2000年1月1日零时 var allFives = new Date(2005,4,5,17,55,55);//本地时间2005年5月5日下午5:55:55
Math对象
JavaScript中的Math对象提供了大量的算术运算功能和数值操作方法。
JavaScript中的Math对象的与众不同之处在于,它是一个全局对象。在使用Math对象之前,既不需要将一个变量声明为Math对象,也不需要定义一个新的Math对象,JavaScript将自动地创建好Math对象,我们只须直接使用它即可。这使得Math对象使用起来很容易。
Math对象的属性中包含一些经常使用的数学常量,如PI属性(即圆周率近似值3.141592653589793)。通常情况下,要访问这些属性,只须在Math之后加上一个点号(.),然后写出要访问的属性名。例如,要计算一个圆的面积,可以使用如下代码:
1 var radius = prompt("Give the radius of the circle", ""); 2 var area = (Math.PI)*radius*radius; 3 document.write("The area is " + area);
1.abs()方法
abs()方法返回所传入参数的绝对值。实际上,绝对值就是一个数去掉正负号之后的数值。例如,–1的绝对值是1,–4的绝对值是4等。对于正数,其绝对值就是该正数本身,例如,1的绝对值就是1。
例如:下面的代码对–101取绝对值,并把结果输出在页面上:
1 var myNumber = -101; 2 document.write(Math.abs(myNumber));
2.ceil()方法
ceil()方法用于向上取整,它把一个数值向上舍入到最接近的最小整数,即对于Math.ceil(n)方法,它将返回大于或等于n的最小整数。例如,10.01向上取整后为11,–9.99向上取整后为–9(这是因为对于负数,–9大于–10)。ceil()方法只有一个参数,即需要向上取整的数值。
ceil()方法的使用与第2章中介绍过的parseInt()方法是不同的。parseInt()方法只是简单地截断小数点之后的所有数字,把整数部分保留下来。而ceil(n)方法将向上取整,返回大于或等于n的最小整数。
例如,下面的代码将在页面上输出两行信息,第一行为ceil()方法对101.01向上取整的结果102,第二行为parseInt()方法取整的结果101:
1 var myNumber = 101.01; 2 document.write(Math.ceil(myNumber) + "<BR>"); 3 document.write(parseInt(myNumber));
3.floor()方法
与ceil()方法类似,floor()方法也用于对一个数字进行取整,所不同的是,floor()方法用于向下取整,它把一个数值向下舍入到最接近的最大整数,即对于Math.floor(n)方法,它将返回小于或等于n的最大整数。例如,Math.floor(10.01)将返回10,而Math.floor(–9.99)将返回–10。
4.round()方法
round()方法用于对一个数值进行四舍五入,即当一个数小数部分大于等于0.5时,则向上舍入,小于等于0.5时则向下舍入。
例如,对于如下代码:
1 var myNumber = 44.5; 2 document.write(Math.round(myNumber) + "<BR>"); 3 myNumber = 44.49; 4 document.write(Math.round(myNumber));
对于44.5将四舍五入为45,而对于44.49则四舍五入为44。
关于取整方法的小结
正如上面所述,ceil()方法、 floor()方法和round()方法都可以进行取整操作。但各个方法的取整操作是不同的。对于floor(n)方法,它返回小于或等于n的最大整数; 对于ceil(n)方法,它返回大于或等于n的最小整数;而round(n)方法将对n进行四舍五入。这几个方法可能容易混淆,表4-3格则用实例进行了 说明:它显示了一列数值,以及将这些数值作为参数分别传入parseInt()函数、ceil()方法、floor()方法和round()方法时的返回 值。