javascript中的对象和数组的应用技巧_Javascript教程-查字典教程网
javascript中的对象和数组的应用技巧
javascript中的对象和数组的应用技巧
发布时间:2016-12-30 来源:查字典编辑
摘要:javascript已经用了有三年多了,但是对一些细节的东西还是一知半解,比如对象和数组,一直都在用一些最基本的操作。这是我学习的一个坏习惯...

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);

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类