由于变数可以接受任何型态的资料,在JavaScript中,常常偷偷发生型态转换,所以您一定要搞清楚,现在的型态是什么。
在JavaScript中有三种基本资料型态:数值、字串与布林值。
数值不分整数或小数,都用IEEE754标准64位元浮点数格式来表示,整数运算时,则使用32位元。可以使用Number.MAX_VALUE、Number.MIN_VALUE来取得数值的最大与最小表示范围,可以使用Number.POSITIVE_INFINITY或Infinity来表示正无限大的数值,使用Number.NEGATIVE_INFINITY或-Infinity来表示负无限大的数值,而非数值(NotANumbr)可以使用Number.NaN、NaN来表示。
数值虽然是基本资料型态,但在必要的时候,会自动转换为对象,例如以下的程式打算操作toString()方法,数值会自动转换为Number的Wrapper对象,将数值转换为2进位制、8进位制或16进位制表示法。
varw=10;
varx=w.toString(2);//转为2进位制表示\varz=w.toString(010);//转为8进位制表示\vary=w.toString(0x10);//转为16进位制表示\ varx=(10).toString(2);//转为2进位制表示\
在JavaScript中,字串是基本资料型态,而要操作相关方法时,执行时期可以转换为String的Wrapper对象,例如:
varmsg=\
msg.length;//传回字串长度5
msg.charAt(0)//传回\(索引从0开始)
String除了以上列出的方法之外,还可以使用indexOf()、substring()等方法。 布林值对应的Wrapper对象是Boolean。
在JavaScript中,可以使用+来串接字串,如果两个运算元中,有一个是字串,一个不是,则运算时后者会转换为字串,例如:
varx=1+\vary=\
但是-、*、/在字串上运作的话,则会尝试将运算元转换为数值再行运算。 varx=\vary=\varz=\
布林值在JavaScript中只有两个值:true跟false,必要时,JavaScript可以自动型态转换为1跟0,例如:
varx=true+10;//11
41.4对象
JavaScript是个支援对象导向的程式语言,但是他跟Java的对象观念不尽相同。
在JavaScript中,所有的对象其实都是Object的实例,实际上它是个具名称的资料集合,先来看个建立对象与其属性的例子:
varo=newObject(); o.name=\o.value=10;
document.write(o.name);//显示\
36
document.write(o.value);//显示10
以上的程式片段,还可以使用Objectinitializer的方式来建立: varo={name:\document.write(o.name); document.write(o.value);
您也可以以巢状的(nested)方式来指定对象,例如: varo={
p1:{x:10,y:10},//p1参考的是对象 p2:{x:20,y:20}//p2参考的是对象 };
document.write(o.p1.x);//显示10 document.write(o.p2.y);//显示20
在JavaScript中,对象的本质是一种阵列,是一种具名称的无序集合,可以像关联阵列(Associatearray)来存取当中的属性,例如:
varo=newObject(); o.name=\o.value=10;
document.write(o['name']);//相当于o.name document.write(o['value']);//相当于o.value o[?value?]=20;//相当于o.value=20
因为JavaScript中的对象具有阵列性质,您可以使用forin语法来取得对象的属性名称与值,例如:
varo={name:\for(pnameino){//取得属性名称 document.write(pname+':')
document.write(o[pname]+'
');//根据名称取得属性值 }
事实上,阵列(Array)的本质与对象是相同的东西,只不过阵列用来取得值的方式是靠索引值,例如:
vararr=newArray(); arr[0]=10;
arr[1]=\arr[2]=true; for(iinarr){
document.write(i+':');
document.write(arr[i]+'
'); }
41.5阵列与函式
在JavaScript中,阵列是Array的实例,您可以使用以下的方式建立阵列: vararr=newArray(); arr[0]=10;
arr[1]=\
37
arr[2]=true;
阵列中可以不同型态的资料,像是上例中的数值、字串或布林值,阵列有索引性质,索引由0开始,您也可以用Arrayinitializer的方式建立阵列并指定当中的元素值:
vararr=[10,\
阵列中不只可以置放基本资料型态,也可以置入对象,例如下例最后一个元素为使用JavaScript对象标记法定义了一个对象:
vararr=[10,'JavaScript',true,{x:10,y:10}]; document.write(arr[3].x);//显示10
JavaScript中没有实质对应的二维阵列观念,如果要在JavaScript中定义二维阵列,则要使用一维阵列来模拟,例如:
vararr=[[1,2,3],[4,5,6]];//arr[0]为一维阵列[1,2,3],arr[1]为一维阵列[4,5,6] for(vari=0;i
document.write('
'); }
接着先来看到JavaScript的函式(function),在JavaScript中的函式,参数不需要宣告型态,如果有传回值,不需要宣告传回值型态,直接使用return即可,如果不传回值则不撰写return,函式执行完毕后自动传回\,例如:
functionsome(arg1,arg2){ varx=arg1;
document.write(arg1,'
'); document.write(arg2,'
'); …. returnx; }
呼叫函式时可以指定任意数目的引数,若引数少于参数个数,少的部份之参数值会被设定为\。
在JavaScript中,函式是First-Class对象,为Function的实例,您可以将函式指定给变数,例如: functionsome(arg){
document.write(arg,'
'); }
varother=some;//将函式对象指定给other other('demo');//跟执行some('demo')是相同的
您可以使用objectinitializer的方式建立函式对象,再指定给某个变数名称,例如: varsome=function(arg){ document.write(arg,'
'); }
some('demo');
或者是以new关键字来建立Function实例,例如: varsome=
newFunction(\some('demo');
Function对象在建构时的第一个引数是参数名称,第二个引数是函式的本体内容。
您也可以将函式指定给对象作为属性,这样作的结果,让函式有点类似Java之类的程式语言中
38
对象导向的方法(method),例如:
varobj=newObject(); obj.some=function(arg){ document.write(arg,'
'); }
obj.some('demo');
在使用Objectinitializer时,也可以指定函式对象,例如: varobj={ x:10,
some:function(){
document.write(this.x); } };
obj.some();
您可以让函式在对象之间“借来借去”,其实您只要知道函式在JavaScript中是Function的实例,这样的操作就一点也不奇怪了:
functionother(){
document.write(this.x); }
varobj1=newObject(); obj1.x=10;
obj1.some=other;//注意,没有括号 varobj2=newObject(); obj2.x=20;
obj2.some=other;//注意,没有括号 obj1.some(); obj2.some();
在JavaScript中有this关键字,它的作用与Java中的this类似,当透过某个对象加上函式名称来呼叫时,会将this参考至该对象,例如:
functionother(){
document.write(this.x); }
varobj1=newObject(); obj1.x=10;
obj1.some=other; varobj2=newObject(); obj2.x=20;
obj2.some=other;
obj1.some();//此时this参考至obj1参考的对象 obj2.some();//此时this参考至obj2参考的对象
因为函式是对象,是Function的实例,所以您可以将函式指定给阵列作为其元素之一,这一点也不奇怪,例如:
varfarr=newArray();
farr[0]=function(arg){returnarg+arg;}; farr[1]=function(arg){returnarg*arg;}; document.write(farr[0](10)+'
');
39
document.write(farr[1](10));
而在JavaScript中,将函式作为引数传递给另一个函式,也是很常见的,例如: functionsome(x){ returnx*x; }
functionother(f){ vary=f(10); returny; }
document.write(other(some));//将some参考的Function实例作为引数,传给f
在上例中,执行other时,当中会执行所传入的Function对象,也就是some参考的实例,所以最后执行结果的传回结果会是100。
一个实际的应用例子是Array的sort()函式,您要传入一个Array实例,并传入一个Function实例,告知如何针对两个元素进行大小比较,例如:
vararr=[1,5,3,2,4]; functionhow(a,b){
if(a>b){return-1;}//传回小于0的值表示a要排在b的后面 elseif(a
Array.sort(arr,how);//传入Array与Function实例 for(iinarr){//显示排序结果 document.write(arr[i]); }
在JavaScript中,您可以传递给函式任意的引数数量,如果引数的数量小于参数的数量,则多出来的参数会被设定为\,事实上所有的引数都被储存在arguments中,参数名称其实只是arguments中某个元素的另一个表示方式。
下例是一个使用arguments的简单任意数目引数的加总函式: functionsome(){ varsum=0;
for(vari=0;i
returnsum; }
document.write(some(1,2,3)); document.write(some(1,2,3,4,5));
如果您想检查函式个数的话,以下是一个例子: functionsome(x,y){
if(arguments.length!=2){ alert(\必须是2个引数\returnnull; }
returnx+y; }
40