欢迎来到福编程网,本站提供各种互联网专业知识!

javascript中的对象和数组的应用技巧

发布时间:2007-01-07 作者: 来源:转载
javascript已经用了有三年多了,但是对一些细节的东西还是一知半解,比如对象和数组,一直都在用一些最基本的操作。这是我学习的一个坏习惯--懒,很多东西都是了解而已,看到稍微复杂点的逻辑就没有耐心。就像学asp时不知道asp跟脚本的关系,学html不知道什么
javascript已经用了有三年多了,但是对一些细节的东西还是一知半解,比如对象和数组,一直都在用一些最基本的操作。这是我学习的一个坏习惯--懒,很多东西都是了解而已,看到稍微复杂点的逻辑就没有耐心。就像学asp时不知道asp跟脚本的关系,学html不知道什么是DOM...结果是学得慢且不扎实,碰到稍复杂的问题就歇菜(扯远了)。
今天继续优化脚本,尝试着合并一些数组时碰到问题,才算去仔细看了手册,做了一些测试。

javascript1.2之后允许使用[]创建数组:


varfirstArray=[];
varsecondArray=["red","green","blue"];
varthirdArray=[,,,,];

可以在数组创建后添加元素:

secondArray[4]=28;

这样的结果是第4个元素和第2个元素之间有1个空元素。
结果类似这样:["red","green","blue",,28]
需要注意的是,数组必须初始化,我测试了数组作为数组元素的定义:

vararrArray=[[]];

本来设想实现二维数组,结果是使用arrArray[i][0]当i>0时无效!
仔细看一下才明白,其实是定义了arrArray[0]为一个空数组,而其他元素都未定义,相当于
vararrArray=[];
arrArray[0]=[];
所以arrArray[1]没有定义,所以如果将它作为数组进行操作会出错。

删除一个数组元素:delete

varmyColors=["red","green","blue"];
deletemyColors[1];
alert("ThevalueofmyColors[1]is:"+myColors[1]);

delete的结果是myColors[1]=undefined,但是myColors.length不变,myColors变成这样:["red",,"blue"]

替换或绝对删除数组元素用slice():


varmyArray=[1,2,3,4,5];
myArray.slice(2);//returns[3,4,5]
myArray.slice(1,3);//returns[2,3]
myArray.slice(-3);//returns[3,4,5]
myArray.slice(-3,-1);//returns[3,4]
myArray.slice(-4,3);//returns[2,3]
myArray.slice(3,1);//returns[]

varmyArray=[1,2,3,4,5];
myArray.splice(3,2,''a'',''b'');
//returns4,5[1,2,3,''a'',''b'']
myArray.splice(1,1,"in","the","middle");
//returns2[1,"in","the","middle",3,''a'',''b'']


看了文档才知道,数组是传递引用的!


varx=[10,9,8];
vary=x;
x[0]=2;
alert("Thevalueofy'sfirstelementis:"+y[0]);

你猜结果是多少呢?
再看这个:

//Declareareferencetype(array)
varrefType=["first","second","third"];

//Declareaprimitivetype(number)
varprimType=10;

//Declareafunctiontakingtwoarguments,whichitwillmodify
functionmodifyValues(ref,prim)
{
ref[0]="changed";//modifythefirstargument,anarray
prim=prim-8;//modifythesecond,anumber
}

//Invokethefunction
modifyValues(refType,primType);
//Printthevalueofthereferencetype
document.writeln("ThevalueofrefTypeis:",refType+"<
>");
//Printthevalueoftheprimitivetype
document.writeln("ThevalueofprimTypeis:",primType);


测试时发现一个问题:


vararr=[];
arr['a']=1;
arr['b']=2;
alert(arr.length);

弹出的数字是0!
看了文档后知道,这样的数组叫做联合数组(AssociativeArrays),arr['a']等同于arr.a,arr.length也就等同于arr['length'],而arr.length在我们初始化arr(vararr=[];)的时候自动赋值为0。
有人把这种联合数组叫做javascript的hashtable。严格上讲,联合数组和普通数组本身都是对象(废话,javascript中的一切都是对象--),意义和用法都是相同的。看下面的例子:

vararr=[];
arr=[1,2,3];
arr.test='test';
alert(arr);
alert(arr[1]);
alert(arr['test']);

vararr={};arr=[2,3,4];alert(arr[0]);
vararr={};和vararr=[]都可以写成vararr=function(){};
从上面的代码可以看出,下标数组跟联合数组分别独立,下标只作用于下标数组,不能访问联合数组,相应的,联合数组不对length属性产生影响。联合数组的标签就是属性,但是下标数组的下标并不是属性,arr[0]!=arr.0,访问arr.0会出错。

在某些时候,用arr['a']代替arr.a作为方法调用会更有效,因为arr['a']中的'a'可以用变量传入,比如将方法赋给变量:


vard=document,l=links;

这时候用直接d.l就会出错,而用d[l]就可以正确执行,alert一下就知道了:)

alert(d.l);//脚本错误
alert(d[l]);//显示object

既然数组是由lenght属性的对象,那么是不是所有具有length属性的对象都是数组呢?比如String。测试之后发现,firefox是可以把String当作数组处理的,但是ie不行:


varmyString="Helloworld";
alert(myString.length);
alert(myString[0]);

数组的对象应该比较独特,用户对象不能完全模拟:

functionmyarray(size){
this.length=size;
varx=0;
}
vararr=newmyarray(5);
arr[9]=1;
alert(arr);
alert(arr[9]);
alert(arr.length);

本以为Array的length属性就是普通的对象属性,结果经过上面的例子发现,arr的length不再是数组length,arr的结构也不是普通数组结构。

定义一个函数/类的方法有好几种:


functionfName(arguments){
//functionbody
};

varfName=function(arguments){
//functionbody
}

varfName=newFunction("arguments","/*functionbody*/");


第三种方法比较好玩,看下面的例子:

vararr=newFunction("vartotal=0;for(vari=0;i

用这个方法可以解析ajax返回的JSON,这样就不用低效的eval了(没有测试是否比eval快):
假设{b:{c:2}}为返回的json字符串:


vararr=newFunction("this.a={b:{c:2}};");
varaa=newarr();
alert(aa.a.b.c);

相关推荐